当前位置: 首页 > 面试题库 >

拥有1亿个零的高效Python数组?

艾安和
2023-03-14
问题内容

在Python中初始化和访问大数组元素的有效方法是什么?

我想在Python中创建一个数组,其中包含1亿个条目(无符号4字节整数),并初始化为零。我想要快速的数组访问,最好是连续内存。

奇怪的是,NumPy阵列的执行速度非常慢。我可以尝试其他替代方法吗?

有array.array模块,但我看不到有效分配1亿个条目的块的方法。

对评论的回应:

  • 我不能使用稀疏数组。对于该算法来说太慢了,因为阵列变得非常密集。
  • 我知道Python是可解释的,但是肯定有一种方法可以执行快速数组操作吗?
  • 我进行了一些分析,并使用NumPy每秒获得约160K数组访问(按索引查找或更新元素)。这似乎很慢。

问题答案:

我做了一些分析,结果完全违反直觉。对于简单的数组访问操作, numpy和array.array比本地Python arrays慢10倍

请注意,对于数组访问,我正在执行以下形式的操作:

a[i] += 1

个人资料:

  • [0] * 20000000

    • 存取:2.3M /秒
    • 初始化:0.8秒
    • numpy.zeros(shape =(20000000,),dtype = numpy.int32)

    • 存取:160K /秒

    • 初始化:0.2s
    • array.array(’L’,[0] * 20000000)

    • 访问:175K /秒

    • 初始化:2.0秒
    • array.array(’L’,(范围(20000000)中的i为0))

    • 访问速度:175K /秒,大概是基于另一个数组的配置文件

    • 初始化:6.7s


 类似资料:
  • 本文向大家介绍10个Python小技巧你值得拥有,包括了10个Python小技巧你值得拥有的使用技巧和注意事项,需要的朋友参考一下 列表推导式 你有一个list: bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这样来做 但是有更好的方法: bag = [elem * 2 for el

  • 我想搜索一个文本文档(或多个文本文档),其中的字符总数可能高达1亿个字符+。 源长度是我正在搜索的文本文件的平均大小。我把它乘以200,得到200个文本文件的平均大小。 那么,如何在不使用这么多RAM的情况下搜索文本文件呢?

  • 如果我从根节点开始,使用一个我要遍历的子节点列表,{“有机体”、“灵长类”、“人类”、“男性”、“John Smith”},然后递归处理一个步骤,并将剩余的子列表传递给子节点,返回这个。subnodes[MyList[0]].getSubnode(MyList.getRange(1,MyList.Count-1))...即使list.getRange()是一个浅层副本,它仍然会为每一级递归创建一个

  • 我用java写了一个简单的程序来创建2个10亿大小的整型数组。我用-Xms10G,也就是10GB的内存运行这个程序,但还是出现了OOM错误。下面是片段。 就我所能想到的10亿int数组使用的内存应该是system . out . println(1000 _ 000 _ 000 * Integer。尺寸);它返回小于2GB的1,935,228,928。所以我的程序的总需求是最大4GB。 即使在方法

  • #Python中的这段非常简短的代码试图模拟前N个自然数的“Eratosthennes筛”,并限制(0)脚本长度;(1) 最小化“if语句”和“for/while循环”;(2) CPU时间方面的效率。 在Intel Core I5上,它返回第一个数字中的质数: < Li > 0.03秒内N = 100,000; < Li > 0.63秒内N = 1,000,000; < li>N = 10,000

  • 我有一个多索引df,带有“海龟”列 我需要的是“网络Pos”。我想不出一个优雅的方法。我需要的是使用Numpy或熊猫的colNet位置。数据集很大,需要使用递归并避免崩溃。 6将被分为6次1 1 1 1 1 1 1 第一个1将乘以基本数量,因此为1*2 第二个1将与第一个1的结果乘以海龟系数2*3 第四个1将与第三个1计算的结果相乘,乘以18*3以上的海龟因子,以此类推,最后求和,得到第一行的结果