我正在求解一个数字近似值(2的平方根),精度达到一百万或更多。 由于我认为知识不足,我可以提高效率。但我确实有一些与Python本身有关的问题,可能有助于减少一些开销时间......
如果我们正在进行一个持续几个小时的计算,那么通过在while循环之外移动一次性条件语句可以减少多少常数因素(IT只会随时使用)?它只是n *常数因子C吗?
根据一些读数,我被告知list.append(x)成本很高。在while循环中,每次迭代都会在列表中附加一个新的整数(我也必须首先使用str(x)....)。 def method6():
return''。join([{num
for num in xrange(loop_count)])
参考阅读:Efficient String Concatenation in Python
我对这种方法很感兴趣。我可以使用它来构建列表,并在我从函数返回时将列表中的每个项目连接成单个字符串(即我需要打印出结果)。我不太确定如何使用这种方法。什么是第一个数字? (请访问该链接,因为stackoverflow删除了第一个数字的引号)
继续#2,我将整数插入列表
打印结果
[1L,'。',4L,1L,4L,2L,1L]
打印结果[0]
1
我不记得那个字母L代表什么.....
我感谢任何帮助!非常感谢你。
答案 0 :(得分:4)
(请尽量将问题限制在一个主题上,而不是一次性询问几个不相关的问题。)
如果你想知道一个变化有多大差异,比如从一个循环中移出一些东西,你需要自己对它进行基准测试。搜索timeit
。
追加到字符串和列表是完全不同的野兽。
字符串是不可变的 - 您不会附加到它们。 a += 'x'
不会将'x'附加到a;它创建一个全新的字符串,使其成为O(n)。当附加大量字符串时,这可能是低效的,因为它变为O(n ^ 2)。 (请注意,当没有其他对a
的引用时,CPython会优化这种特殊情况,从而消除额外的副本。并非所有Python实现都可以执行此操作。)
列表中不存在此问题:列表是可变的。附加到列表是O(1),因此在循环中追加它们的效率。 (它会定期重新分配列表,为新项目腾出空间,但效率很高。)
如果要生成大量数据以插入列表,通常最好使用生成器函数,但您不必这样做。
在Python 2中,1L
声明了一个long而不是int;见http://docs.python.org/library/stdtypes.html#numeric-types-int-float-long-complex。
答案 1 :(得分:1)
附加到列表并不昂贵。附加到字符串代价很高。
这是因为Python中的字符串是不可变的,因此每次附加时,都会生成一个全新的字符串。但是,列表是可变的,因此附加到列表只会在最后添加单个项目。
大多数Python实现中列表的后备实现都是数组,因此如果初始化为较小的大小,那么随着时间的推移 的列表需要重新分配几次,但由于大多数实现都倾向于为分配大小使用指数增长因子,问题并不是那么多(如果你想要,你可以通过类似my_list = [None]*1000000
之类的预先分配整个长度来避免它,以获得一百万个列表{ {1}} S)。