6

我们可以像这样进行数字迭代:

for i in xrange(10):
    print i,

在 C 风格中:

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

是的,我知道,第一个更不容易出错,更 Pythonic,但它是否足够快作为 C 样式版本?

PS。我来自 C++ 星球,对 Python 来说还很陌生。

4

7 回答 7

16

我确定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
于 2009-09-04T09:26:46.257 回答
15

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

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

于 2009-09-04T05:57:32.263 回答
3

第一个。

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

PS:没关系,如今的机器速度如此之快,以至于在使用彻底的分析器识别瓶颈之前考虑微优化毫无意义。

于 2009-09-04T10:48:59.147 回答
1

他们都是避免的:-)

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

于 2009-09-04T08:22:59.020 回答
1

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

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

于 2009-09-04T15:42:02.990 回答
0

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

于 2009-09-04T12:31:53.970 回答
0

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

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

于 2009-09-04T15:45:16.977 回答