Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么创建一个小数组并将其展开比完全从一个大列表创建一个数组更有效?_Python_Arrays_Python 3.x_Performance - Fatal编程技术网

Python 为什么创建一个小数组并将其展开比完全从一个大列表创建一个数组更有效?

Python 为什么创建一个小数组并将其展开比完全从一个大列表创建一个数组更有效?,python,arrays,python-3.x,performance,Python,Arrays,Python 3.x,Performance,在一本书中找到以下代码,但无法获得完整的解释 x = array('d', [0] * 1000000) x = array('d', [0]) * 1000000 第一种情况下的python代码创建一个1000000长度的数组,而第二种情况下的python代码创建一个单一大小的数组,并将该大小乘以相同的因子。 第二种情况下的代码比第一种情况下快100倍 速度差的确切原因是什么?数组的python实现如何发挥作用?python列表存储python对象,而数组.array对象存储原始C数据类型

在一本书中找到以下代码,但无法获得完整的解释

x = array('d', [0] * 1000000)
x = array('d', [0]) * 1000000 
第一种情况下的python代码创建一个1000000长度的数组,而第二种情况下的python代码创建一个单一大小的数组,并将该大小乘以相同的因子。 第二种情况下的代码比第一种情况下快100倍


速度差的确切原因是什么?数组的python实现如何发挥作用?

python
列表存储python对象,而
数组.array
对象存储原始C数据类型

第一行需要单独处理
[0]*1000000
中的每个对象,遵循指针并执行类型检查、动态分派和引用计数,以及所有一百万次来处理每个元素并将其数据转换为原始C双精度。每个元素碰巧都是相同的,但是
数组
构造函数不知道这一点。此外,还要支付构建和清理百万元素列表的费用


第二行更简单。Python只需
memcpy
数组的内容就可以执行一百万次。

但是memcpy函数必须花时间动态分配新指针,并将数据复制到第二行的新内存单元中。@AnshulJain:不,它没有。memcpy不分配内存。也许你的印象是
array.array
array存储Python对象?@AnshulJain你能用array('d',itertools.repeat(01000000))对它进行基准测试吗?这至少应该跳过构建临时列表。