从列表或元组创建一个新的 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
反汇编后的输出相同,但时间更接近
在创建新的 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
常量测试设置
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
反汇编后的输出相同,但时间更接近