在Python中提倡使用for i in xrange(...)
风格的循环结构背后的基本原理是什么?对于简单的整数循环,开销的差别是巨大的。我用两段代码进行了一个简单的测试:
文件idiomatic.py
:
#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
for x in xrange(N):
for y in xrange(M):
pass
文件cstyle.py
:
分析结果如下:
bash-3.1$ time python cstyle.py
real 0m0.109s
user 0m0.015s
sys 0m0.000s
bash-3.1$ time python idiomatic.py
real 0m4.492s
user 0m0.000s
sys 0m0.031s
我能理解为什么Pythonic版本比较慢——我想这与调用xrange N次有很大关系,如果有办法倒带生成器,这可能会被消除。然而,由于执行时间上的差异,为什么要使用python版本呢?在
编辑:我使用Martelli先生提供的代码再次进行了测试,结果现在确实更好了:
我想我可以从这里列举一些结论:
1)模块范围内的大量代码是个坏主意,即使代码被封装在if __name__ == "__main__":
块中。在
2)*奇怪的是,将属于thebadone
的代码修改为我不正确的版本(让y在不重置的情况下增长)在性能上几乎没有差别,甚至对于更大的M和N值也是如此
你忘了在内环后将y重置为0。在
ed:20.63s修复后与6.97s使用xrange
以下是适当的比较,例如循环.py公司名称:
所有实质性的代码都应该总是在函数中——在模块的顶层放上一亿个循环,这是对性能的漠视,是对任何试图测量所述性能的嘲弄。在
完成后,您会看到:
^{pr2}$因此,适当地衡量一下,您提倡的坏方法比Python提倡的好方法慢3倍左右。我希望这能让你重新考虑你的错误主张。在
很适合迭代数据结构
for i in ...
语法对于在数据结构上迭代非常有用。在较低级别的语言中,您通常会迭代一个由int索引的数组,但是使用python语法可以消除索引步骤。在相关问题 更多 >
编程相关推荐