python - 就地修改列表 : Calculating a sieve of primes in a python list

标签 python list

欧拉计划的第 10 题要求我们计算 2,000,000 以下的所有素数之和。

我的算法是:

  1. 为小于 2,000,000 的数字构造一个筛子
  2. 将筛子中的所有数字相加。

我不喜欢创建多个列表而不是对同一个列表执行计算的代码。

下面是我的代码:

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/

相关文章:

python - 为什么在 sklearn GridsearchCV SVM 中使用 class_weight 时会出现错误?

python - 在另一个列表中附加一个列表

python - 如何打印两个数字的公因数列表?

java - 从一个列表复制到另一个

python - 在 Python 中共享全局数据

python - Python 中的不可变列表

android - 有谁知道我是否可以使用 kivy 访问和管理 wifi 连接?

python - 前缀文件号的零个数

python - 创建一个稍微修改过的 Python 元组副本?

python - 如何在没有音频库的情况下编辑原始 PCM 音频数据?