Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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/0/backbone.js/2.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 为什么Numpy在创建三维阵列方面比二维阵列更快?_Python_Arrays_Numpy_Initialization - Fatal编程技术网

Python 为什么Numpy在创建三维阵列方面比二维阵列更快?

Python 为什么Numpy在创建三维阵列方面比二维阵列更快?,python,arrays,numpy,initialization,Python,Arrays,Numpy,Initialization,从创建NX44096X4096阵列的计时来看,当N=2或3时,Numpy的速度似乎比N=1快得多: import numpy as np %timeit a = np.zeros((2, 4096, 4096), dtype=np.float32, order='C') 5.24 µs ± 98.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) %timeit a = np.zeros((4096, 4096), dtyp

从创建NX44096X4096阵列的计时来看,当N=2或3时,Numpy的速度似乎比N=1快得多:

import numpy as np
%timeit a = np.zeros((2, 4096, 4096), dtype=np.float32, order='C')
5.24 µs ± 98.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit a = np.zeros((4096, 4096), dtype=np.float32, order='C')
23.4 ms ± 401 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
差别是惊人的。为什么会这样?如何使N=1时的情况至少与N>1时的情况一样快?“%timeit”的计时是否可能完全错误

上下文:我需要创建另一个具有不同类型(uint8)的4096 x 4096的单个数组,我正在尝试获得最快的Pythonic(或与Numpy相关的)实现。NX44096X4096阵列将由三列阵列(从文件读取)中的非零值填充,其中第一列为1D坐标,第二列和第三列为第一和第二幅图像的强度值(因此N=2)。使用稀疏矩阵目前还不是一种选择。 这类档案有1.3亿份。因此,上述情况也发生了很多次

[编辑]这是在macOS Sierra下的Python 3.6.4和numpy 1.14下。Windows下的相同版本不会复制相同的行为。较小数组的np.zeros()花费的时间是两倍大数组的一半。从评论和提到的重复问题中,我理解这可能是由于内存分配中的阈值造成的。但是,这并不符合
%timeit
的目的


[EDIT 2]关于重复问题,这里的问题应该更多地是关于如何正确计时此函数,而不必编写额外的代码来访问变量,以便操作系统实际分配内存。额外的代码不会影响计时结果吗?难道没有一个简单的方法来描述这个吗

我无法复制它,因此它可能依赖于机器和/或numpy版本。我在CentOS 6上使用Python2.6.6和numpy版本1.4.1,第一个版本为22毫秒,第二个版本为11毫秒。如果你能用你的numpy和python版本以及你正在使用的操作系统来更新这个问题,可能会有所帮助。如果你计划打开1.3亿个文件,并为每个文件创建一个2x4096x4096阵列,这意味着超过4 PB的阵列和大量的磁盘访问。即使您不需要一次将所有这些阵列存储在内存中,速度也会非常慢。我已经添加了软件版本@user2357112是的,我们知道这将非常缓慢(目前只有几个月),因此我们试图了解所有可能的瓶颈。当然,在更合适的基础设施中,这将以并行方式发生。对于这两种情况,我的计时时间都在10到11微秒之间。Debian、Python 3.6.4、NumPy 1.13.3。如果分配时间特别烦人,您可以重用现有阵列并覆盖其内容。如果您需要同时打开所有数据,您可能需要重新考虑您的策略。在Python中有分布式数组处理方面的工作,请看一看,否则我无法重现这种行为,但如果您一个接一个地进行此测试,垃圾收集器可能会造成一些危害。还将速度与纯内存分配(np.empty)进行比较。但我认为,对于如此大量的数据,高I/O速度和快速数据压缩策略是您的主要问题。