Python首选语法背后的基本原理

2024-04-29 19:33:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在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

^{pr2}$

分析结果如下:

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值也是如此


Tags: 文件代码nameinpy版本bashfor
3条回答

你忘了在内环后将y重置为0。在

#!/usr/bin/env python
M = 10000
N = 10000

if __name__ == "__main__":
    x, y = 0, 0
    while x < N:
        while y < M:
            y += 1
        x += 1
        y = 0

ed:20.63s修复后与6.97s使用xrange

以下是适当的比较,例如循环.py公司名称:

M = 10000
N = 10000

def thegoodone():
   for x in xrange(N):
       for y in xrange(M):
           pass

def thebadone():
    x = 0
    while x < N:
        y = 0
        while y < M:
            y += 1
        x += 1

所有实质性的代码都应该总是在函数中——在模块的顶层放上一亿个循环,这是对性能的漠视,是对任何试图测量所述性能的嘲弄。在

完成后,您会看到:

^{pr2}$

因此,适当地衡量一下,您提倡的坏方法比Python提倡的好方法慢3倍左右。我希望这能让你重新考虑你的错误主张。在

很适合迭代数据结构

for i in ...语法对于在数据结构上迭代非常有用。在较低级别的语言中,您通常会迭代一个由int索引的数组,但是使用python语法可以消除索引步骤。在

相关问题 更多 >