Yin*_*nan 5 arrays performance numpy list
所以我有一个包含 5,000,000 个整数的列表。我想将列表覆盖到 numpy 数组中。我尝试了以下代码:
numpy.array( list )
Run Code Online (Sandbox Code Playgroud)
但速度非常慢。
我对该操作进行了 100 次基准测试,并对列表进行了 100 次循环。没有太大区别。
有什么好主意如何让它更快吗?
如果您有cython,您可以创建一个绝对更快的函数。但只是一个警告:如果列表中存在无效元素(非整数或太大的整数),它将崩溃。
\n\n我在这里使用 IPython 魔法(%load_ext cython和%%cython),重点是展示该函数的外观 - 不是展示如何编译 Cython 代码(这并不难,Cythons“如何编译”文档非常好)。
%load_ext cython\n\n%%cython\n\ncimport cython\nimport numpy as np\n\n@cython.boundscheck(False)\ncpdef to_array(list inp):\n cdef long[:] arr = np.zeros(len(inp), dtype=long)\n cdef Py_ssize_t idx\n for idx in range(len(inp)):\n arr[idx] = inp[idx]\n return np.asarray(arr)\nRun Code Online (Sandbox Code Playgroud)\n\n以及时间安排:
\n\nimport numpy as np\n\ndef other(your_list): # the approach from @Damian Lattenero in the other answer\n ret = np.zeros(shape=(len(your_list)), dtype=int)\n np.copyto(ret, your_list)\n return ret\n\ninp = list(range(1000000))\n%timeit np.array(inp)\n# 315 ms \xc2\xb1 5.42 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n%timeit np.array(inp, dtype=int)\n# 311 ms \xc2\xb1 2.28 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n%timeit other(inp)\n# 316 ms \xc2\xb1 3.97 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n%timeit to_array(inp)\n# 23.4 ms \xc2\xb1 1.15 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\nRun Code Online (Sandbox Code Playgroud)\n\n所以速度快了 10 倍以上。
\n