ฉันคิดว่าการใช้งานของแต่ละคนเป็นเรื่องส่วนตัวมากเกินไปสำหรับฉันที่จะเข้าใจดังนั้นฉันจะยึดติดกับตัวเลข
ฉันเปรียบเทียบเวลาที่ใช้ในการสร้างและเปลี่ยนตัวแปรใน dict คลาส new_style และคลาส new_style กับสล็อต
นี่คือรหัสที่ฉันใช้ในการทดสอบ (มันค่อนข้างยุ่ง แต่ก็ใช้งานได้)
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')))
และนี่คือผลลัพธ์ ...
การสร้าง...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
การเปลี่ยนตัวแปร ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
ดังนั้นหากคุณแค่จัดเก็บตัวแปรคุณต้องมีความเร็วและไม่ต้องให้คุณคำนวณมากมายฉันขอแนะนำให้ใช้ dict (คุณสามารถสร้างฟังก์ชันที่ดูเหมือนเป็นวิธีการได้เสมอ) แต่ถ้าคุณต้องการเรียนจริงๆอย่าลืมใช้__ สล็อต __เสมอ
บันทึก:
ฉันทดสอบ 'คลาส' ทั้งคลาส new_style และ old_style ปรากฎว่าคลาส old_style สร้างได้เร็วกว่า แต่แก้ไขได้ช้ากว่า (ไม่มาก แต่สำคัญถ้าคุณสร้างคลาสจำนวนมากแบบวนซ้ำ (เคล็ดลับ: คุณทำผิด))
นอกจากนี้เวลาในการสร้างและเปลี่ยนแปลงตัวแปรในคอมพิวเตอร์ของคุณอาจแตกต่างกันเนื่องจากของฉันเก่าและช้า ตรวจสอบให้แน่ใจว่าคุณได้ทดสอบด้วยตัวเองเพื่อดูผลลัพธ์ 'จริง'
แก้ไข:
ในภายหลังฉันได้ทดสอบ namedtuple: ฉันไม่สามารถแก้ไขได้ แต่ในการสร้างตัวอย่าง 10,000 ตัวอย่าง (หรืออะไรทำนองนั้น) ใช้เวลา 1.4 วินาทีดังนั้นพจนานุกรมจึงเร็วที่สุด
ถ้าฉันเปลี่ยนฟังก์ชัน dictเพื่อรวมคีย์และค่าและส่งคืนคำสั่งแทนตัวแปรที่มี dict เมื่อฉันสร้างมันจะให้0.65 แทน 0.8 วินาที
class Foo(dict):
pass
สร้างเป็นเหมือนชั้นเรียนกับสล็อตและการเปลี่ยนแปลงตัวแปรที่ช้าที่สุด (0.17 วินาที) ดังนั้นไม่ใช้ชั้นเรียนเหล่านี้ ไปที่ dict (speed) หรือสำหรับคลาสที่ได้มาจาก object ('syntax candy')
dict
can เหมาะสมถึง ข้อได้เปรียบที่เป็นระเบียบ: เมื่อคุณแก้ไขข้อบกพร่องเพียงแค่พูดprint(request)
และคุณจะเห็นข้อมูลสถานะทั้งหมดได้ทันที ด้วยวิธีการที่คลาสสิกกว่านี้คุณจะต้องเขียน__str__
วิธีการแบบกำหนดเองของคุณซึ่งแย่มากถ้าคุณต้องทำมันตลอดเวลา