나는 각각의 사용법이 너무 주관적이어서 그것에 대해 이해하지 못한다고 생각하기 때문에 나는 숫자에 충실 할 것입니다.
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 클래스 모두 에서 'Class'를 테스트했습니다 . old_style 클래스는 생성 속도가 빠르지 만 수정 속도가 느립니다 (단단한 루프에서 많은 클래스를 생성하는 경우에는 많지는 않지만 중요합니다 (팁 : 잘못하고 있음)).
또한 내 것이 오래되고 느리기 때문에 변수를 만들고 변경하는 시간은 컴퓨터에서 다를 수 있습니다. '실제'결과를 보려면 직접 테스트해야합니다.
편집하다:
나중에 namedtuple을 테스트했습니다. 수정할 수는 없지만 10000 개의 샘플 (또는 이와 유사한 것)을 만드는 데 1.4 초가 걸렸으므로 사전이 실제로 가장 빠릅니다.
난 경우 딕셔너리 기능을 변경 그것을 만들 때 키와 값을 포함하고 상기 딕셔너리를 포함하는 변수 대신 딕셔너리를 반환 나야 제공 0.65 대신 0.8 초가.
class Foo(dict):
pass
생성은 슬롯이있는 클래스와 같으며 변수 변경이 가장 느리므로 (0.17 초) 이러한 클래스를 사용하지 마십시오 . dict (속도) 또는 객체에서 파생 된 클래스 ( '구문 캔디')로 이동
dict
것이 합리적 일 수 있습니다. 깔끔한 장점 : 디버그 할 때 말하면print(request)
모든 상태 정보를 쉽게 볼 수 있습니다. 보다 고전적인 접근 방식을 사용하면 사용자 지정__str__
메서드 를 작성 해야합니다. 항상해야하는 경우에는 짜증이납니다.