从交互到非交互:手把手图解Schnorr协议如何用Fiat-Shamir变换搞定数字签名
2026/6/3 2:51:17
Python 以简洁优雅的语法和强大的生态系统闻名,从 Web 开发到数据科学、人工智能,它几乎无处不在。然而,很多初学者在处理大规模数据时会遇到一个痛点:Python 的原生 list 在数值计算上速度偏慢。这时,NumPy 的ndarray登场,成为科学计算和数据分析的核心工具。
在实际项目中,ndarray 的性能往往比 Python list 快50~100 倍。这不仅是一个数字上的差距,更是 Python 能够在数据科学和人工智能领域立足的关键原因。本文将结合基础原理、代码示例和实战案例,带你深入理解这一速度优势背后的秘密。
# Python list 示例lst=[1,2,3,4,5]print(type(lst))# <class 'list'>importnumpyasnp arr=np.array([1,2,3,4,5])print(type(arr))# <class 'numpy.ndarray'>importnumpyasnpimporttime# Python list 计算平方lst=list(range(1000000))start=time.time()lst_square=[x**2forxinlst]end=time.time()print("Python list 耗时:",end-start)# NumPy ndarray 计算平方arr=np.arange(1000000)start=time.time()arr_square=arr**2end=time.time()print("NumPy ndarray 耗时:",end-start)典型结果:
a=np.array([1,2,3])b=2print(a+b)# [3 4 5]# Python listlst=list(range(1000000))lst_norm=[(x-min(lst))/(max(lst)-min(lst))forxinlst]# NumPy ndarrayarr=np.arange(1000000)arr_norm=(arr-arr.min())/(arr.max()-arr.min())→ NumPy 版本不仅更快,而且代码更简洁。
# Python list 矩阵乘法(低效)A=[[1,2],[3,4]]B=[[5,6],[7,8]]C=[[sum(a*bfora,binzip(row,col))forcolinzip(*B)]forrowinA]# NumPy 矩阵乘法(高效)A=np.array([[1,2],[3,4]])B=np.array([[5,6],[7,8]])C=np.dot(A,B)→ NumPy 调用 BLAS 库,速度远超 Python list。
尽量使用 ndarray 而非 list
在数值计算场景下,优先选择 NumPy。
避免 Python 循环
使用向量化操作和广播机制。
合理选择数据类型
如float32vsfloat64,在性能与精度之间权衡。
结合其他库
NumPy 的 ndarray 之所以比 Python list 快50~100 倍,核心原因在于:
这不仅是技术上的优势,更是 Python 在科学计算领域的立足之本。
开放性问题:
欢迎在评论区分享经验与思考,让我们共同探索 Python 的无限可能。
👉 我可以进一步为你绘制Python list 与 NumPy ndarray 内存布局对比图,让读者更直观理解性能差异。要不要我帮你生成这张示意图?