欧拉计划的第 10 题要求我们计算 2,000,000 以下的所有素数之和。
我的算法是:
- 为小于 2,000,000 的数字构造一个筛子
- 将筛子中的所有数字相加。
我不喜欢创建多个列表而不是对同一个列表执行计算的代码。
下面是我的代码:
def main(number_above):
list_of_numbers = list(range(number_above))
list_of_numbers = calculate_sieve(list_of_numbers)
print summation_of_primes(list_of_numbers)
def calculate_sieve(list_of_numbers):
for prime in list_of_numbers:
if prime >= 2 and prime != 'C':
multiple = 2
while multiple * prime < len(list_of_numbers):
list_of_numbers[ prime * multiple ] = 'C'
multiple += 1
return list_of_numbers
def summation_of_primes(list_of_numbers):
summation = 0
for element in list_of_numbers:
if element != 'C':
summation += element
return summation - 1
创建列表的步骤:
- 首先,创建一个范围为 (2,000,000) 的数字列表
- 其次,将此列表传递给 calculate_sieve 函数,该函数会取消所有组合。
- 然后,calculate_sieve 函数返回一个列表给主函数。
- 最后,这个列表被传递给求和函数。
python 是在原地操作同一个列表,还是一次保存多个列表? 如果它正在创建列表的多个副本,是否有一种方法可以通过对列表进行适当的操作来最大限度地减少内存使用量?
最佳答案
Is python operating on the same list in place?
是的,主要是。
- 将列表作为参数传递给函数不会创建新列表。
- 修改列表中的元素不会创建新列表。
- 从函数返回列表不会创建新列表。
您拥有的唯一可能会创建重复列表的代码是这一行:
list_of_numbers = list(range(number_above))
在 Python 2.7 及以下版本中,range
已经返回一个列表。对结果调用 list
将创建第二个列表。您可以安全地编写 list_of_numbers = range(number_above)
并节省一点内存。
在 3.X 中,range
返回一个 range
对象,所以如果你想后续做赋值,那么 list
调用是必要的,比如 list_of_numbers[ prime * multiple ] = 'C'
。
关于python - 就地修改列表 : Calculating a sieve of primes in a python list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25243632/