从列表或元组创建一个新的 numpy 数组

Create a new numpy array from list or tuple

在创建新的 numpy 数组时,您可以这样创建它们:

a = numpy.array((2, 5))
b = numpy.array((a[0] + 1, 10))

或者像这样:

a = numpy.array([2, 5])
b = numpy.array([a[0] + 1, 10])

哪种方式更好?

元组大约快 10%。

>>> timeit.timeit("numpy.array((2, 5))", setup="import numpy")
0.9039838570024585
>>> timeit.timeit("numpy.array([2, 5])", setup="import numpy")
1.0044978570003877

我在 numpy.array((a[0] + 1, 10)) 示例中也得到了相同的结果。 dis 工具揭示了差异的原因:

>>> dis.dis("numpy.array((2, 5))")
  1           0 LOAD_NAME                0 (numpy)
              2 LOAD_METHOD              1 (array)
              4 LOAD_CONST               0 ((2, 5))
              6 CALL_METHOD              1
              8 RETURN_VALUE
>>> dis.dis("numpy.array([2, 5])")
  1           0 LOAD_NAME                0 (numpy)
              2 LOAD_METHOD              1 (array)
              4 LOAD_CONST               0 (2)
              6 LOAD_CONST               1 (5)
              8 BUILD_LIST               2
             10 CALL_METHOD              1
             12 RETURN_VALUE

似乎元组在创建时被视为单个对象,而需要构建列表。

经过一些基于@leopardshark's 的测试,似乎元组只有在根据常量初始化数组时才会更好。如果您从 tuple/list 个变量进行初始化,则差异可以忽略不计

常量测试设置

import dis, timeit

list_timing = timeit.timeit('numpy.array([2, 5])', setup = 'import numpy', number = 1000000)
tuple_timing = timeit.timeit('numpy.array((2, 5))', setup = 'import numpy', number = 1000000)

print(f"List mean time: {list_timing}")
>>> 0.6392972
print(f"Tuple mean time: {tuple_timing}")
>>> 0.6296533

此处的反汇编输出与@leopardshark

相同

变量测试设置

import dis, timeit
x, y = 2, 5

list_timing = timeit.timeit('numpy.array([x, y])', setup = 'import numpy; x, y = 2, 5', number = 1000000)
tuple_timing = timeit.timeit('numpy.array((x, y))', setup = 'import numpy; x, y = 2, 5', number = 1000000)

print(f"List mean time: {list_timing}")
>>> 0.6279472
print(f"Tuple mean time: {tuple_timing}")
>>> 0.6288363

print(dis.dis('numpy.array([x, y])'))
>>>  1           0 LOAD_NAME                0 (numpy)
>>>              2 LOAD_METHOD              1 (array)
>>>              4 LOAD_NAME                2 (x)
>>>              6 LOAD_NAME                3 (y)
>>>              8 BUILD_LIST               2
>>>             10 CALL_METHOD              1
>>>             12 RETURN_VALUE

print(dis.dis('numpy.array((x, y))'))
>>>  1           0 LOAD_NAME                0 (numpy)
>>>              2 LOAD_METHOD              1 (array)
>>>              4 LOAD_NAME                2 (x)
>>>              6 LOAD_NAME                3 (y)
>>>              8 BUILD_TUPLE              2
>>>             10 CALL_METHOD              1
>>>             12 RETURN_VALUE

反汇编后的输出相同,但时间更接近