用numpy列出理解性能?

2024-04-20 12:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

寻找一些帮助,了解如何优化一些数组处理,针对一些postgis兼容的数据类型。输入数据如下所示:

{
    "items": [
        {
            "id": 10000,
            "coords": [[644, 1347, 1], [653, 1353, 1], [637, 1358, 1], [633, 1362, 1]]
        }
]
}

以下是我尝试过的:

^{pr2}$

这是输出:

file load time:
8.29696655273e-05
array creation:
2.86102294922e-06
python array string processing time:
1.09672546387e-05
python array ppygis:
8.10623168945e-06
numpy array creation:
1.31130218506e-05
numpy array string processing time:
0.000116109848022
numpy array ppygis:
3.60012054443e-05

为什么使用numpy数组的操作比普通python数组慢得多?在


Tags: 数据numpyidstringtimeitems数组coords
1条回答
网友
1楼 · 发布于 2024-04-20 12:25:08

一般来说,numpy数组上的迭代操作比列表上的等价操作慢。部分原因是从列表创建数组需要时间,无论是初始创建还是中间步骤。当您对Numpy数组执行编译操作时,Numpy数组获得了速度优势,即迭代以编译速度而不是解释速度进行。在

在您的示例中,字典源并不重要

In [372]: arr = d['items'][0]['coords']
In [373]: arr
Out[373]: [[644, 1347, 1], [653, 1353, 1], [637, 1358, 1], [633, 1362, 1]]
In [374]: narr=np.array(arr)
In [375]: narr.shape
Out[375]: (4, 3)
In [376]: narr
Out[376]: 
array([[ 644, 1347,    1],
       [ 653, 1353,    1],
       [ 637, 1358,    1],
       [ 633, 1362,    1]])

做一个简单的任务,将1加到所有值上:

^{pr2}$

字符串格式大小写:

In [383]: a=[' '.join(map(str, c)) for c in arr]
In [384]: a
Out[384]: ['644 1347 1', '653 1353 1', '637 1358 1', '633 1362 1']
In [385]: b='('+') ('.join(map(str,a)) + ')'
In [386]: b
Out[386]: '(644 1347 1) (653 1353 1) (637 1358 1) (633 1362 1)'

或者用列表理解代替地图:

In [396]: '(%s)'%') ('.join([' '.join([str(i) for i in c]) for c in arr])
Out[396]: '(644 1347 1) (653 1353 1) (637 1358 1) (633 1362 1)'

narr.tolist()上执行相同的操作几乎一样好,而且比直接迭代narr要好。在

[c for c on narr]生成一个由4个数组组成的列表;[str(i) for i in c]然后需要对这些子数组中的每一个进行迭代。在

从numpy数组中生成一个Point对象的列表是对该结构的一种不良使用。在

您可以创建一个structured数组,并访问整组点的“x”值。当你想处理整个结构,或者至少整个行和列时,这就是键使用数组。在

In [436]: parr = narr.view([('x', '<i4'), ('y', '<i4'), ('z', '<i4')]).squeeze()

In [437]: parr
Out[437]: 
array([(644, 1347, 1), (653, 1353, 1), (637, 1358, 1), (633, 1362, 1)], 
      dtype=[('x', '<i4'), ('y', '<i4'), ('z', '<i4')])

In [438]: parr[0]
Out[438]: (644, 1347, 1)

In [439]: parr['x']
Out[439]: array([644, 653, 637, 633])

相关问题 更多 >