在Python中追加和打印数字列表

2 投票
2 回答
1101 浏览
提问于 2025-04-16 12:21

我正在解决一个数值近似的问题,想要计算出平方根2,精度要达到一百万位或更多。我觉得自己在效率提升方面的知识还不够,所以能做的改进不多。不过,我有几个关于Python本身的问题,可能能帮助我减少一些时间开销……

  1. 如果我们进行的计算需要几个小时,那么把一个只用一次的条件语句放到while循环外面,能减少多少时间呢?是n乘以一个常数C吗?

  2. 我在阅读一些资料时,听说list.append(x)的开销很大。在while循环里,每次迭代都会把一个新的整数添加到列表中(而且我还得先把它转换成字符串……)。

    比如这个函数:

    return ''.join([num for num in xrange(loop_count)])

我对这个方法很感兴趣。我可以用这个方法来构建列表,然后在函数返回时把列表里的每个项目合并成一个字符串吗?(也就是说,我需要打印出结果。)我不太确定这个方法该怎么用,first num是什么?(请访问链接,因为stackoverflow会去掉first num的引号)

  1. 接着第二个问题,我正在往列表里插入整数。

    打印结果

    [1L, '.', 4L, 1L, 4L, 2L, 1L]

    打印结果的第一个元素

    1

我不记得那个字母L代表什么了……

非常感谢任何帮助!谢谢你们。

2 个回答

1

往列表里添加东西其实不费劲,但往字符串里添加东西就比较麻烦。

这是因为在Python中,字符串是不可变的,也就是说每次你想添加内容的时候,都会生成一个全新的字符串。而列表是可变的,所以往列表里添加东西只需要在最后加一个新项就行了。

大多数Python实现中的列表是用数组来实现的,所以如果你一开始创建的列表比较小,随着时间的推移,列表变大了,可能会需要重新分配空间几次。不过,大多数实现会使用一种指数增长的方式来分配空间,所以这并不是个大问题。如果你想避免这种情况,可以在一开始就分配好足够的空间,比如用 my_list = [None]*1000000 来创建一个包含一百万个 None 的列表。

4

(请尽量将问题限制在一个主题上,而不是一次问几个无关的问题。)

如果你想知道把某个东西移出循环会带来多大的变化,你需要自己进行性能测试。可以搜索一下 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

撰写回答