在Python中追加和打印数字列表
我正在解决一个数值近似的问题,想要计算出平方根2,精度要达到一百万位或更多。我觉得自己在效率提升方面的知识还不够,所以能做的改进不多。不过,我有几个关于Python本身的问题,可能能帮助我减少一些时间开销……
如果我们进行的计算需要几个小时,那么把一个只用一次的条件语句放到while循环外面,能减少多少时间呢?是n乘以一个常数C吗?
我在阅读一些资料时,听说list.append(x)的开销很大。在while循环里,每次迭代都会把一个新的整数添加到列表中(而且我还得先把它转换成字符串……)。
比如这个函数:
return ''.join([
num
for num in xrange(loop_count)])
我对这个方法很感兴趣。我可以用这个方法来构建列表,然后在函数返回时把列表里的每个项目合并成一个字符串吗?(也就是说,我需要打印出结果。)我不太确定这个方法该怎么用,first num是什么?(请访问链接,因为stackoverflow会去掉first num的引号)
接着第二个问题,我正在往列表里插入整数。
打印结果
[1L, '.', 4L, 1L, 4L, 2L, 1L]
打印结果的第一个元素
1
我不记得那个字母L代表什么了……
非常感谢任何帮助!谢谢你们。
2 个回答
往列表里添加东西其实不费劲,但往字符串里添加东西就比较麻烦。
这是因为在Python中,字符串是不可变的,也就是说每次你想添加内容的时候,都会生成一个全新的字符串。而列表是可变的,所以往列表里添加东西只需要在最后加一个新项就行了。
大多数Python实现中的列表是用数组来实现的,所以如果你一开始创建的列表比较小,随着时间的推移,列表变大了,可能会需要重新分配空间几次。不过,大多数实现会使用一种指数增长的方式来分配空间,所以这并不是个大问题。如果你想避免这种情况,可以在一开始就分配好足够的空间,比如用 my_list = [None]*1000000
来创建一个包含一百万个 None
的列表。
(请尽量将问题限制在一个主题上,而不是一次问几个无关的问题。)
如果你想知道把某个东西移出循环会带来多大的变化,你需要自己进行性能测试。可以搜索一下 timeit
。
向字符串和列表添加内容是完全不同的事情。
字符串是不可变的——你不能直接往里面添加内容。比如 a += 'x'
并不是把 'x' 加到 a 里,而是创建了一个全新的字符串,这样的操作是 O(n) 的复杂度。如果你要添加很多字符串,这样就会变成 O(n^2),效率会很低。(不过要注意,CPython 在没有其他引用指向 a
的情况下,会优化这个特定的情况,避免额外的复制。但并不是所有的 Python 实现都能做到这一点。)
而列表就没有这个问题:列表是可变的。往列表里添加内容的复杂度是 O(1),所以在循环中添加内容是很高效的。(不过它会定期需要重新分配空间来容纳新项,但这个过程也是高效的。)
如果你要生成很多数据来插入到列表中,通常使用生成器函数会更好,但这不是必须的。
在 Python 2 中,1L
表示长整型,而不是整型;可以查看 http://docs.python.org/library/stdtypes.html#numeric-types-int-float-long-complex。