我最近比较了[]
和list()
的处理速度,惊奇地发现[]
的运行速度是list()
的三倍多。我对{}
和dict()
进行了相同的测试,结果几乎相同:[]
和{}
都花费了大约0.128秒/百万个周期,而list()
和dict()
每个周期大约花费了0.428秒/百万个周期。
这是为什么?[]
和{}
(可能还有()
和''
)会立即传回一些空的stock文本的副本,而它们的显式命名对应项(list()
、dict()
、tuple()
、str()
)会完全着手创建一个对象,不管它们实际上是否有元素?
我不知道这两种方法有什么不同,但我很想知道。 我在文档中找不到答案,搜索空括号的问题比我预想的要多。
我通过分别调用timeit.timeit("[]")
和timeit.timeit("list()")
,以及timeit.timeit("{}")
和timeit.timeit("dict()")
来比较列表和字典来获得计时结果。我在运行Python2.7.9。
我最近发现了“Why is if True slower than if 1?”,它比较了if True
和if 1
的性能,似乎触及了类似的文字和全局场景;也许也值得考虑。
list()
需要全局查找和函数调用,但[]
编译为单个指令。见:因为
list
是一个function来将字符串转换为列表对象,而[]
则用于创建一个现成的列表。试试这个(可能对你更有意义):当
给你一个实际的清单,里面有你放进去的东西。
因为
[]
和{}
是文字语法。Python可以创建字节码来创建list或dictionary对象:list()
和dict()
是独立的对象。它们的名字需要被解析,堆栈必须参与到参数的推送中,帧必须被存储以便以后检索,并且必须进行调用。这需要更多的时间。对于空的情况,这意味着您至少有一个^{} (它必须通过全局命名空间以及^{} module 进行搜索),然后是一个^{} ,它必须保留当前帧:
您可以使用
timeit
分别计时名称查找:时间差异可能是字典哈希冲突。从调用这些对象的时间中减去这些时间,并将结果与使用文字的时间进行比较:
因此,必须调用对象每1000万次调用需要额外的
1.00 - 0.31 - 0.30 == 0.39
秒。通过将全局名称别名为局部名称(使用
timeit
设置,绑定到名称的所有内容都是局部名称),可以避免全局查找开销:但你永远无法克服这种代价。
相关问题 更多 >
编程相关推荐