Jus*_*eve 5 python arrays performance numpy
我有一个用于跟踪各种值的数组。数组的2500x1700大小,所以不是很大。在会话结束时,我需要将该数组中的所有值重置为零。我尝试创建一个新的零数组并将数组中的所有值替换为零,并且创建一个全新的数组要快得多。
代码示例:
\nfor _ in sessions:\n # Reset our array\n tracking_array[:,:] = 0\n\n1.44 s \xc2\xb1 19.1 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\nRun Code Online (Sandbox Code Playgroud)\n相对
\nfor _ in sessions:\n # Reset our array\n tracking_array = np.zeros(shape=(2500, 1700))\n\n7.26 ms \xc2\xb1 133 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\nRun Code Online (Sandbox Code Playgroud)\n与仅替换数组中的值相比,为什么创建全新的数组要快得多?
\n原因是主流操作系统(Windows、Linux和MaxOS)上数组没有填满内存。Numpy 通过向操作系统 (OS) 请求虚拟内存中的零填充区域来分配零填充数组。该区域不直接映射到物理RAM中。当您在虚拟内存中读/写页面时,映射和零初始化通常由操作系统延迟完成。例如,当您稍后将数组设置为 1 时,就会支付此成本。这是一个证明:
\nIn [19]: %timeit res = np.zeros(shape=(2500, 1700))\n10.8 \xc2\xb5s \xc2\xb1 118 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n\nIn [20]: %timeit res = np.ones(shape=(2500, 1700))\n7.54 ms \xc2\xb1 151 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\nRun Code Online (Sandbox Code Playgroud)\n前者意味着 RAM 吞吐量至少为 4.2 GiB/s,虽然不高但还算公平。后者意味着 RAM 吞吐量至少约为 2930 GiB/s,这太高了,因为我的机器(以及任何标准台式机/服务器机器)几乎无法达到 36 GiB/s(使用仔细优化的基准) 。
\n| 归档时间: |
|
| 查看次数: |
1089 次 |
| 最近记录: |