一招实现让Python Numpy快到飞起!
off999 2025-09-01 11:29 4 浏览 0 评论
在本文中,笔者将介绍Numexpr这个强大的Python库,它可以显著提升NumPy数组的计算性能。
Numexpr是一个专门用于提高NumPy数组计算性能的工具。它通过避免为中间结果分配内存,提高了缓存利用率并减少了内存访问,从而实现更好的性能。相比于NumPy,Numexpr的多线程功能可以充分利用所有核心,通常带来显著的性能扩展。
github链接:
https://github.com/pydata/numexpr
Numpy计算
当Numpy遇到大数组时,逐元素计算会遇到两个极端。例如下面的代码是两个大的NumPy数组:
import numpy as np
import numexpr as ne
x = np.random.rand(10_000_000)
y = np.random.rand(10_000_000)
如若要计算表达式 x ** 8 + y * 2 的结果,通常有两种方法:
一是Numpy的向量化计算,使用两个临时数组temp_x和temp_y分别存储 x ** 8 和 y * 2 的结果。实现方案如下:
import numpy as np
import numexpr as ne
import timeit
x = np.random.rand(100_000_000)
y = np.random.rand(100_000_000)
def calculation():
temp_x = x ** 8
temp_y = y * 2
result = temp_x + temp_y
print(result)
execution_time = timeit.timeit(calculation, number=1)
print(f"Execution time: {execution_time} seconds")
这时候,内存中有四个数组,分别是:x、y、temp_x 和 temp_y,势必容易造成大量的内存浪费。
Execution time: 3.1453814 seconds
并且,每个数组的大小都超出了CPU缓存的容量,无法很好的利用它。
另一种方法是遍历两个数组中每个元素并分别计算:
import numpy as np
import numexpr as ne
import timeit
x = np.random.rand(100_000_000)
y = np.random.rand(100_000_000)
z = np.empty(100_000_000, dtype=np.uint32)
def calcu_elements(x, y, z):
for i in range(0, len(x), 1):
z[i] = x[i] ** 8 + 2 * y[i]
# 使用lambda函数将calcu_elements函数包装起来,并将其作为参数传递给timeit.timeit函数
execution_time = timeit.timeit(lambda: calcu_elements(x, y, z), number=1)
print(f"Execution time: {execution_time} seconds")
Execution time: 57.0129075 seconds
这种方法的性能更差,运算速度非常慢,因为它不能使用矢量化计算,并且只能部分利用CPU缓存。
Numexpr计算
Numexpr提供了一个evaluate方法,它接收一个表达式字符串,并将其编译为字节码进行计算。
同时,Numexpr还包含一个虚拟机程序,其中包含多个向量寄存器,用于存储数据块,每个向量寄存器使用的块大小为4096。
在计算过程中,Numexpr会将数据块发送到CPU的L1缓存中,以避免内存访问的延迟,并提高计算效率。此外,Numexpr的虚拟机是用C编写的,不受Python的GIL限制,可以充分利用多核CPU的计算能力。
相比单独使用NumPy,Numexpr在计算大型数组时通常会更快。实现代码如下:
import numpy as np
import numexpr as ne
import timeit
x = np.random.rand(100_000_000)
y = np.random.rand(100_000_000)
def calculate_expression():
return ne.evaluate('x ** 8 + y * 2')
execution_time = timeit.timeit(calculate_expression, number=1)
print(f"Execution time: {execution_time} seconds")
Execution time: 0.36257230000000007 seconds
由此可以看出,Numexpr计算速度相比于Numpy,明显快到飞起!
- 上一篇:通过anaconda安装python及人工智能框架pytorch安装
- 已经是最后一篇了
相关推荐
- 一招实现让Python Numpy快到飞起!
-
在本文中,笔者将介绍Numexpr这个强大的Python库,它可以显著提升NumPy数组的计算性能。Numexpr是一个专门用于提高NumPy数组计算性能的工具。它通过避免为中间结果分配内存,提高了缓...
- 通过anaconda安装python及人工智能框架pytorch安装
-
专栏推荐python2和python3的切换Linux安装好了之后,一般有python2和python3,linux默认的是python2,但是现在python可能马上就要被淘汰了,所以我们平时都是使...
- VBA宏总崩溃?Python脚本老闪退?这招让你的代码从此“抗摔”!
-
导语:上周有个读者急吼吼地私信我:“老师,我写了个VBA宏整理半年数据,结果跑到第800行的时候弹出个Error1004,前功尽弃!有没有办法让宏‘抗摔’?”还有位Python新手更崩溃:“明明写了...
- 六种程序设计语言的循环及循环嵌套之比较(周兴富)
-
我在《72岁老翁学python》(六)一文里展示了仿写的第一个python程序zxf-python-cx01.py,以及试写的一个程序zxf-python-cx02.py,虽然错误多多,但是万里长征第...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- Python循环的简单写法_python 循环写法
-
在之前的短文里归纳总结了Shell的循环写法,里面也提到了Python的循环,这里也对Python的循环做个简单的说明。Python的循环基本上2种:while循环和for-in循环,和Shell还是...
- Python循环语句:从基础到进阶_python里面的循环语句
-
在Python编程语言中,循环语句是必不可少的控制流工具。它们允许重复执行一段代码,直到满足特定条件。本文将介绍Python中的两种主要循环类型:for循环和while循环,并分别结合实例来说明其用法...
- Python教程(十):for循环和range()函数
-
今天我们将深入探讨非常有用的**for循环和内置的range()函数**—这两个工具让您能够重复执行操作并高效地遍历序列。让我们探索如何使用它们以及它们在哪些地方表现出色。今天您将学习什么什么...
- 《循环(for/while)》_循环for的用法
-
循环(for/while)循环是编程中处理重复任务的核心工具,Python提供了两种主流循环结构:for循环(遍历可迭代对象)和while循环(根据条件重复执行)。本节将系统讲解两者的语法、使用场景及...
- Python循环结构精解:掌握while循环与累加算法
-
循环结构是程序三大基本结构之一,其本质是反复执行相同操作直到满足特定条件。现实世界中的循环无处不在:旋转的车轮人体的血液循环每日重复的学习过程Python循环分类while循环:基于条件判断的循环fo...
- Python教程(十一):循环控制 – break、continue和pass
-
昨天,我们探索了for循环和range()函数。今天,我们将更进一步,学习如何使用三个强大的工具来控制循环内部的流程:break、continue和pass。这些命令让您能够:停止循环(break)...
- AI最火语言python之循环结构_python语言中的循环结构
-
循环结构是指在某种情况下反复执行某段代码,其中被反复执行的代码段称之为循环体,循环结构主要负责完成重复性的工作。有for循环语句和while循环语句实现循环结构。1.for循环语句for语句主要用于实...
- Python入门学习教程:第 5 章 循环语句
-
5.1什么是循环语句?在编程中,我们经常需要重复执行某段代码。例如,计算1到100的总和、打印列表中的所有元素等。如果手动编写每一次的执行代码,不仅繁琐,还容易出错。循环语句就是用来解决这种...
- Python之Web开发框架学习-Django基础及安装
-
Django是一个高级PythonWeb框架,鼓励快速开发和简洁实用的设计。Django使使用更少的代码快速构建更好的Web应用程序变得更加容易。注-Django是DjangoSoftware...
- Python基础入门- Python编程环境搭建-Python编译器安装
-
Python3下载访问https://www.python.org/进行下载Python安装双击下载的“.exe”文件即可安装手动配置python环境变量如果是在安装过程中,勾选了配置环境变量...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)