为什么numpy数组比python中的list快?

lnlaulya  于 12个月前  发布在  Python
关注(0)|答案(4)|浏览(79)

我最近发现numpy数组比python中的普通列表更快。我运行了下面的代码

import numpy as np

import matplotlib.pyplot as plt

import pandas as pd

my_listy = list(range(1000000))

my_array = np.array(range(1000000))

%time for i in range(10): my_list2 = my_listy * 2

%time for i in range(10): my_array2 = my_array * 2

我发现列表的执行时间大约是425 ms,而numpy数组的执行时间大约是371 ms。具体原因是什么??

6l7fqoea

6l7fqoea1#

你在这里执行两个完全不同的操作,所以你不能直接比较:将一个列表乘以2将创建一个新的列表,其中该列表与其自身连接(因此输出列表的长度是输入列表的两倍),而将一个numpy数组乘以2将创建一个与原始数组相同长度的新数组,但其中每个元素都乘以2。
尽管如此,如果你试图执行一个实际上对应于numpy情况的列表操作(元素乘元素),例如:

my_list2 = [n * 2 for n in my_listy]

你也会发现numpy的例子更快。这是因为numpy中所需的循环是在由编译后的C代码组成的共享库中执行的,而不是使用Python中的显式循环(for循环或列表解析)。

$ python -mtimeit -s 'import numpy as np; my_array = np.array(range(1000000))' 'my_array2 = my_array * 2'
1000 loops, best of 3: 1.45 msec per loop

$ python -mtimeit -s 'my_listy = list(range(1000000))' 'my_list2 = [n*2 for n in my_listy]'
10 loops, best of 3: 50.8 msec per loop
vq8itlhq

vq8itlhq2#

以下是Numpy速度之快背后的主要原因。
Numpy数组是一个类似的数据类型的集合,这些数据类型密集地封装在内存中。Python列表可以有不同的数据类型,这在计算时会有很多额外的约束。
Numpy能够将一个任务划分为多个子任务,并对它们进行并行处理。
Numpy函数在C中实现。这也使得它比Python列表更快。
Python最初并不是为数字运算而设计的,但随着时间的推移,numpy被创建用于这个范围(使Python更擅长数字运算)。来源:towardsdatascience.com

7fhtutme

7fhtutme3#

NumPy的性能优于Python列表,因为它具有固有的优势,包括同构数据类型和在连续内存块中有效存储数组,使其能够更快速地执行操作,并具有上级内存管理。
代码清楚地展示了NumPy优于Python列表的上级速度,展示了NumPy在处理大型数据集和以惊人的速度和精度执行复杂数学运算方面的效率。

import numpy as np
import time

start_time = time.time()
numpy_array = np.arange(1_000_000)
result = numpy_array.sum()
numpy_execution_time = time.time() - start_time

start_time = time.time()
python_list = list(range(1_000_000))
result = sum(python_list)
python_execution_time = time.time() - start_time

print("NumPy execution time:", numpy_execution_time)
print("Python list execution time:", python_execution_time)
wf82jlnq

wf82jlnq4#

在Numpy中,你可以在C++中实现,这比纯Python更快。

相关问题