什么是更快的Python,“while”或“for xrange”

时间:2009-09-04 05:48:23

标签: python micro-optimization

我们可以做数字迭代,如:

for i in xrange(10):
    print i,

并采用C风格:

i = 0
while i < 10:
    print i,
    i = i + 1

是的,我知道,第一个不容易出错,更像pythonic,但它的速度是否足够C?版本?

PS。我是来自C ++星球,而且是Python上的新星。

7 个答案:

答案 0 :(得分:15)

谁在乎?认真。如果您想知道,请使用timeit包(您可以使用-m从命令行调用它。)

但这根本不重要,因为差异可以忽略不计。一般而言,如果您想要速度,Python不是您选择的语言。

答案 1 :(得分:15)

我确信while版本较慢。 Python必须在循环的每个回合中查找整数对象的添加操作等,它不是纯粹的C只是因为它看起来像它!

如果你想要一个完全如上所述的pythonic版本,请使用:

print " ".join(str(i) for i in xrange(10))

编辑:我的时间看起来像这样。这只是一个没有打印的愚蠢运行循环,只是为了向您展示在Python中写出“i + = 1”等成本的原因。

$ python -mtimeit "i=0" "while i < 1000: i+=1"
1000 loops, best of 3: 303 usec per loop
$ python -mtimeit "for i in xrange(1000): pass"
10000 loops, best of 3: 120 usec per loop

答案 2 :(得分:3)

第一个。

你的意思是,开发得更快,对吧?

PS:没关系,这些天的机器是如此之快,以至于在使用彻底的分析器确定瓶颈之前,对微优化进行思考是毫无意义的。

答案 3 :(得分:1)

他们两者以避免: - )

一般来说,每当我看到迭代数字时,我会看到一些非pythonic代码,可以使用列表或生成器上的迭代以更好的方式表示。
实际上,我说的是“pythonic”,但它完全是关于可读性。使用惯用代码将提高可读性,并最终提高性能,因为编译器将更好地了解如何优化它。

答案 4 :(得分:0)

好吧,如果你追求数字代码的效率,你应该使用numpyscipy。您的集成可以快速写为numpy.sum( numpy.arange( 10 ) )

答案 5 :(得分:0)

如果你的程序太慢,请尝试使用psyco

不要担心您的问题中的微优化类型。编写你的程序是可维护的(包括遵循标准的Python风格,以便其他程序员可以更容易地阅读它。)

答案 6 :(得分:-1)

在Python中,更短更清晰的版本总是更好。如果我没有弄错,范围和xrange函数不是原生的,如果你尝试xrange(sys.maxint + 1),你会得到一个溢出错误。

此外,这到底有什么用呢?如果您只是打印10个数字,那么可读性肯定会高出一千倍 - 而且我认为您不会打印超过一百万个数字......