2010-06-30 26 views
6

Trong python, tôi biết rằng tìm kiếm một biến phạm vi tại địa phương là nhanh hơn đáng kể so với tìm kiếm một biến phạm vi toàn cầu. Vì vậy:Python: Các thuộc tính lớp có tương đương với các biến cục bộ khi bên trong một phương thức không?

a = 4 
def function() 
    for x in range(10000): 
     <do something with 'a'> 

là chậm hơn so với

def function() 
    a = 4 
    for x in range(10000): 
     <do something with 'a'> 

Vì vậy, khi tôi nhìn vào một định nghĩa lớp, với một thuộc tính và phương pháp:

class Classy(object): 
    def __init__(self, attribute1): 
     self.attribute1 = attribute1 
     self.attribute2 = 4 
    def method(self): 
     for x in range(10000): 
      <do something with self.attribute1 and self.attribute2> 

là sử dụng của tôi self.attribute giống như chức năng đầu tiên hoặc thứ hai của tôi? Điều gì về nếu tôi lớp con cấp Classy, ​​và cố gắng truy cập attribute2 từ một phương thức trong lớp con của tôi?

Trả lời

4

Biến phạm vi cục bộ rất nhanh vì trình thông dịch không cần tra cứu từ điển. Nó biết tại thời gian biên dịch chính xác có bao nhiêu biến cục bộ sẽ có và nó tạo ra các hướng dẫn để truy cập chúng như một mảng.

Thuộc tính thành viên yêu cầu tra cứu từ điển, vì vậy chúng thực thi tương tự như ví dụ đầu tiên của bạn bằng cách sử dụng biến toàn cục.

Đối với tốc độ, bạn có thể làm một cái gì đó như:

attribute1 = self.attribute1 
# do stuff with attribute1 

mà bóng tối attribute1 trong một biến địa phương, vì vậy chỉ một tra cứu từ điển đơn là cần thiết. Tôi sẽ không bận tâm trừ khi tôi đã làm một số hồ sơ chỉ ra rằng một phương pháp là một nút cổ chai, mặc dù.

+0

Trong khi tôi tò mò về câu trả lời cho câu hỏi này, lý do thực sự là vì tôi có một số hằng số hầu như chắc chắn sẽ chỉ được sử dụng bởi một phương pháp, và tôi không chắc mình có nên xác định chúng trong phương thức đó, hoặc trong init (trong trường hợp sau này tôi nhận ra chúng cần được truy cập ở nơi khác). Vì khả năng đó là từ xa, tôi nghĩ tôi sẽ định nghĩa chúng trong phương thức. Cảm ơn. – Wilduck

Các vấn đề liên quan