gpt4 book ai didi

python - 使用 numpy 数组时,struct.pack 在 python 2.6 中要慢得多

转载 作者:行者123 更新时间:2023-12-01 04:17:35 24 4
gpt4 key购买 nike

基本问题

大家好。我相信我发现了 python 2.6、struct.pack 和 numpy 数组的问题。问题是,当我使用 python 2.6 运行以下代码时,它非常慢(但当我使用 python 2.7 或 2.5 运行它时,它足够快)。

import numpy as np
import struct

x = np.mat(np.random.randint(0,3000,(1000,1000)))

z = struct.pack('<'+'H'*x.size,*np.asarray(x).reshape(-1).astype(int))

我需要能够为我正在开发的应用程序多次运行类似的东西,现在我唯一的选择是使用 python 2.6 真正运行它。我问是否有一种更快的方法可以使用 python 2.6 来完成此操作,或者我是否应该花时间尝试让系统管理员为我安装 python 2.7 或 3.0。

至于为什么我需要能够在 python 2.6 上运行以及我如何发现这行代码是问题所在,请参见下文。

说来话长

我正在开发一个项目,其中我使用 python 修改输入到另一个程序中的一些文件,以便我可以在该程序上运行蒙特卡洛模拟。一切都很顺利,我使用 python 3 编写了所有代码,确保它们也都可以在 python 2.7 中运行,并在我的动力不足的计算机上运行了几个测试用例。事情进展得很顺利。运行单个测试用例大约需要 30 秒。然后我将我的分析移植到我们拥有的服务器上,该服务器比我的笔记本电脑更快/更强大。

我在服务器上一切正常,但遇到了一个大问题。现在运行一个测试用例需要 30 分钟。经过一番调查后,我发现服务器只安装了 python 2.6 版本,我相信这就是问题所在。此外,我认为以下行尤其是问题

z = struct.pack('<'+'H'*x.size,*np.asarray(x).reshape(-1).astype(int))

其中 x 是 numpy 矩阵,numpy 已作为 np 导入,struct 也已导入。我相信这条线是问题所在的原因如下。首先,在 python 2.6 中运行此行时,我收到以下警告:

DeprecationWarning: struct integer overflow masking is deprecated

尽管我绝对确定我尝试打包的数组的内容落在无符号短整数的范围内。使用 python 2.7 和 3.5 运行相同的代码我也没有收到弃用警告。

此外,我尝试使用 time it 进行一个简短的测试。我在本地计算机上使用 python 2.7 和 3.0 运行以下代码并得到以下结果:

python3 -m timeit "import numpy as np;import struct;x=np.mat(np.random.randint(0,3200,(1000,1000)));z = struct.pack('<'+'H'*x.size,*np.asarray(x).reshape(-1).astype(int))"
10 loops, best of 3: 467 msec per loop

python2.7 -m timeit "import numpy as np;import struct;x=np.mat(np.random.randint(0,3200,(1000,1000)));z = struct.pack('<'+'H'*x.size,*np.asarray(x).reshape(-1).astype(int))"
10 loops, best of 3: 468 msec per loop

这非常好。然后我尝试使用 python 2.6 运行它

python2.6 -m timeit "import numpy as np;import struct;x=np.mat(np.random.randint(0,3200,(1000,1000)));z = struct.pack('<'+'H'*x.size,*np.asarray(x).reshape(-1).astype(int))"
10 loops, best of 3: 34.4 sec per loop

时间增加了 7350%,简直荒谬……

我要问的问题是——有什么方法可以使用 python 2.6 绕过这个瓶颈,还是我应该尝试让服务器的系统管理器升级到 python 3.5 或 2.7?”

最佳答案

为什么不避免 struct完全模块并让 numpy为您处理二进制转换吗?

例如:

import numpy as np

x = np.random.randint(0, 3200, (1000, 1000))
z = x.astype('<u2').tostring()

'<u2'指定小尾数 ( < ) 无符号 int ( u ) 16 位 ( 2 )。它与 <H 相同.

只是为了证明它们是相同的:

z1 = x.astype('<u2').tostring()
z2 = struct.pack('<'+'H'*x.size,*np.asarray(x).reshape(-1).astype(int))
assert z1 == z2

对于计时(注意:这是在 python 2.7 上),numpy 版本快了约 100 倍:

In [7]: %timeit x.astype('<u2').tostring()
100 loops, best of 3: 1.33 ms per loop

In [8]: %timeit struct.pack('<'+'H'*x.size,*np.asarray(x).reshape(-1).astype(int))
1 loops, best of 3: 118 ms per loop

关于python - 使用 numpy 数组时,struct.pack 在 python 2.6 中要慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34139350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com