Tôi nghĩ rằng cách sử dụng của mỗi cái là cách quá chủ quan đối với tôi khi tham gia vào điều đó, vì vậy tôi sẽ chỉ bám vào các con số.
Tôi đã so sánh thời gian cần thiết để tạo và thay đổi một biến trong lớp dict, lớp new_style và lớp new_style với các vị trí.
Đây là mã tôi đã sử dụng để kiểm tra nó (nó hơi lộn xộn nhưng nó hoạt động tốt.)
import timeit
class Foo(object):
def __init__(self):
self.foo1 = 'test'
self.foo2 = 'test'
self.foo3 = 'test'
def create_dict():
foo_dict = {}
foo_dict['foo1'] = 'test'
foo_dict['foo2'] = 'test'
foo_dict['foo3'] = 'test'
return foo_dict
class Bar(object):
__slots__ = ['foo1', 'foo2', 'foo3']
def __init__(self):
self.foo1 = 'test'
self.foo2 = 'test'
self.foo3 = 'test'
tmit = timeit.timeit
print 'Creating...\n'
print 'Dict: ' + str(tmit('create_dict()', 'from __main__ import create_dict'))
print 'Class: ' + str(tmit('Foo()', 'from __main__ import Foo'))
print 'Class with slots: ' + str(tmit('Bar()', 'from __main__ import Bar'))
print '\nChanging a variable...\n'
print 'Dict: ' + str((tmit('create_dict()[\'foo3\'] = "Changed"', 'from __main__ import create_dict') - tmit('create_dict()', 'from __main__ import create_dict')))
print 'Class: ' + str((tmit('Foo().foo3 = "Changed"', 'from __main__ import Foo') - tmit('Foo()', 'from __main__ import Foo')))
print 'Class with slots: ' + str((tmit('Bar().foo3 = "Changed"', 'from __main__ import Bar') - tmit('Bar()', 'from __main__ import Bar')))
Và đây là đầu ra ...
Đang tạo ...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
Thay đổi một biến ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
Vì vậy, nếu bạn chỉ lưu trữ các biến, bạn cần tốc độ và nó sẽ không yêu cầu bạn thực hiện nhiều phép tính, tôi khuyên bạn nên sử dụng dict (bạn luôn có thể tạo một hàm trông giống như một phương thức). Tuy nhiên, nếu bạn thực sự cần các lớp học, hãy nhớ - luôn sử dụng __ slot __ .
Ghi chú:
Tôi đã kiểm tra 'Lớp' với cả lớp new_style và old_style. Hóa ra là các lớp old_style được tạo nhanh hơn nhưng sửa đổi chậm hơn (không nhiều nhưng đáng kể nếu bạn đang tạo nhiều lớp trong một vòng lặp chặt chẽ (mẹo: bạn đang làm sai)).
Ngoài ra, thời gian tạo và thay đổi các biến có thể khác nhau trên máy tính của bạn vì máy tính của tôi đã cũ và chậm. Hãy chắc chắn rằng bạn tự kiểm tra nó để xem kết quả 'thực'.
Biên tập:
Sau đó, tôi đã thử nghiệm têntuple: tôi không thể sửa đổi nó nhưng để tạo 10000 mẫu (hoặc cái gì đó tương tự), phải mất 1,4 giây để từ điển thực sự là nhanh nhất.
Nếu tôi thay đổi hàm dict để bao gồm các khóa và giá trị và trả về dict thay vì biến chứa dict khi tôi tạo, nó sẽ cho tôi 0,65 thay vì 0,8 giây.
class Foo(dict):
pass
Việc tạo giống như một lớp có các khe và việc thay đổi biến là chậm nhất (0,17 giây) nên không sử dụng các lớp này . đi cho một dict (tốc độ) hoặc cho lớp có nguồn gốc từ đối tượng ('cú pháp kẹo')
dict
có thể có ý nghĩa, để. lợi thế gọn gàng: khi bạn gỡ lỗi, chỉ cần nóiprint(request)
và bạn sẽ dễ dàng xem tất cả thông tin trạng thái. với cách tiếp cận cổ điển hơn, bạn sẽ phải viết các__str__
phương thức tùy chỉnh của mình , điều này thật tệ nếu bạn phải làm điều đó mọi lúc.