iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >怎么让Python运行速度提高100倍
  • 606
分享到

怎么让Python运行速度提高100倍

2023-06-17 00:06:32 606人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“怎么让python运行速度提高100倍”,在日常操作中,相信很多人在怎么让Python运行速度提高100倍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么让Python运行速度提高100倍

这篇文章主要介绍“怎么让python运行速度提高100倍”,在日常操作中,相信很多人在怎么让Python运行速度提高100倍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么让Python运行速度提高100倍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

我们来看一下这个最简单的例子,从1一直累加到1亿。

最原始的代码:

import time def foo(x,y):  tt = time.time()  s = 0  for i in range(x,y):  s += i  print('Time used: {} sec'.fORMat(time.time()-tt))  return s print(foo(1,100000000))

结果:

Time used: 6.779874801635742 sec 4999999950000000

我们来加一行代码,再看看结果:

from numba import jit import time @jit def foo(x,y):  tt = time.time()  s = 0  for i in range(x,y):  s += i  print('Time used: {} sec'.format(time.time()-tt))  return s print(foo(1,100000000))

结果:

Time used: 0.04680037498474121 sec 4999999950000000

是不是快了100多倍呢?

那么下面就分享一下“为啥numba库的jit模块那么牛掰?”

NumPy的创始人Travis  Oliphant在离开Enthought之后,创建了CONTINUUM,致力于将Python大数据处理方面的应用。最近推出的Numba项目能够将处理NumPy数组的Python函数JIT编译为机器码执行,从而上百倍的提高程序的运算速度。

Numba项目的主页上有linux下的详细安装步骤。编译LLVM需要花一些时间。

windows用户可以从Unofficial Windows Binaries for Python Extension  Packages下载安装LLVMPy、meta和numba等几个扩展库。

下面我们看一个例子:

import numba as nb from numba import jit @jit('f8(f8[:])') def sum1d(array):  s = 0.0  n = array.shape[0]  for i in range(n):  s += array[i]  return s import numpy as np array = np.random.random(10000) %timeit sum1d(array) %timeit np.sum(array) %timeit sum(array) 10000 loops, best of 3: 38.9 us per loop 10000 loops, best of 3: 32.3 us per loop 100 loops, best of 3: 12.4 ms per loop

numba中提供了一些修饰器,它们可以将其修饰的函数JIT编译成机器码函数,并返回一个可在Python中调用机器码的包装对象。为了能将Python函数编译成能高速执行的机器码,我们需要告诉JIT编译器函数的各个参数和返回值的类型。我们可以通过多种方式指定类型信息,在上面的例子中,类型信息由一个字符串’f8(f8[:])’指定。其中’f8’表示8个字节双精度浮点数,括号前面的’f8’表示返回值类型,括号里的表示参数类型,’[:]’表示一维数组。因此整个类型字符串表示sum1d()是一个参数为双精度浮点数的一维数组,返回值是一个双精度浮点数。

需要注意的是,JIT所产生的函数只能对指定的类型的参数进行运算:

print sum1d(np.ones(10, dtype=np.int32)) print sum1d(np.ones(10, dtype=np.float32)) print sum1d(np.ones(10, dtype=np.float64)) 1.2095376009e-312 1.46201599944e+185 10.0

如果希望JIT能针对所有类型的参数进行运算,可以使用autojit:

from numba import autojit @autojit def sum1d2(array):  s = 0.0  n = array.shape[0]  for i in range(n):  s += array[i]  return s %timeit sum1d2(array) print sum1d2(np.ones(10, dtype=np.int32)) print sum1d2(np.ones(10, dtype=np.float32)) print sum1d2(np.ones(10, dtype=np.float64)) 10000 loops, best of 3: 143 us per loop 10.0 10.0 10.0

autoit虽然可以根据参数类型动态地产生机器码函数,但是由于它需要每次检查参数类型,因此计算速度也有所降低。numba的用法很简单,基本上就是用jit和autojit这两个修饰器,和一些类型对象。下面的程序列出numba所支持的所有类型:

print [obj for obj in nb.__dict__.values() if isinstance(obj, nb.minivect.minitypes.Type)] [size_t, Py_uintptr_t, uint16, complex128, float, complex256, void, int , long double, unsigned PY_LONG_LONG, uint32, complex256, complex64, object_, npy_intp, const char *, double, unsigned short, float, object_, float, uint64, uint32, uint8, complex128, uint16, int, int , uint8, complex64, int8, uint64, double, long double, int32, double, long double, char, long, unsigned char, PY_LONG_LONG, int64, int16, unsigned long, int8, int16, int32, unsigned int, short, int64, Py_ssize_t]

工作原理

numba的通过meta模块解析Python函数的ast语法树,对各个变量添加相应的类型信息。然后调用llvmpy生成机器码,***再生成机器码的Python调用接口。

meta模块

通过研究numba的工作原理,我们可以找到许多有用的工具。例如meta模块可在程序源码、ast语法树以及Python二进制码之间进行相互转换。下面看一个例子:

def add2(a, b):  return a + b

decompile_func能将函数的代码对象反编译成ast语法树,而str_ast能直观地显示ast语法树,使用这两个工具学习Python的ast语法树是很有帮助的。

from meta.decompiler import decompile_func from meta.asttools import str_ast print str_ast(decompile_func(add2)) FunctionDef(args=arguments(args=[Name(ctx=Param(),  id='a'),  Name(ctx=Param(),  id='b')],  defaults=[],  kwarg=None,  vararg=None),  body=[Return(value=BinOp(left=Name(ctx=Load(),  id='a'),  op=Add(),  right=Name(ctx=Load(),  id='b')))],  decorator_list=[],  name='add2')

而python_source可以将ast语法树转换为Python源代码:

from meta.asttools import python_source python_source(decompile_func(add2)) def add2(a, b):  return (a + b)

decompile_pyc将上述二者结合起来,它能将Python编译之后的pyc或者pyo文件反编译成源代码。下面我们先写一个tmp.py文件,然后通过py_compile将其编译成tmp.pyc。

with open("tmp.py", "w") as f:  f.write(""" def square_sum(n):  s = 0  for i in range(n):  s += i**2  return s """) import py_compile py_compile.compile("tmp.py")

下面调用decompile_pyc将tmp.pyc显示为源代码:

with open("tmp.pyc", "rb") as f:  decompile_pyc(f) def square_sum(n):  s = 0  for i in range(n):  s += (i ** 2)  return s

llvmpy模块

LLVM是一个动态编译器,llvmpy则可以通过Python调用LLVM动态地创建机器码。直接通过llvmpy创建机器码是比较繁琐的,例如下面的程序创建一个计算两个整数之和的函数,并调用它计算结果。

from llvm.core import Module, Type, Builder from llvm.ee import ExecutionEngine, GenericValue # Create a new module with a function implementing this: # # int add(int a, int b) { # return a + b; # } # my_module = Module.new('my_module') ty_int = Type.int() ty_func = Type.function(ty_int, [ty_int, ty_int]) f_add = my_module.add_function(ty_func, "add") f_add.args[0].name = "a" f_add.args[1].name = "b" bb = f_add.append_basic_block("entry") # IRBuilder for our basic block builder = Builder.new(bb) tmp = builder.add(f_add.args[0], f_add.args[1], "tmp") builder.ret(tmp) # Create an execution engine object. This will create a JIT compiler # on platforms that support it, or an interpreter otherwise ee = ExecutionEngine.new(my_module) # Each argument needs to be passed as a GenericValue object, which is a kind # of variant arg1 = GenericValue.int(ty_int, 100) arg2 = GenericValue.int(ty_int, 42) # Now let's compile and run! retval = ee.run_function(f_add, [arg1, arg2]) # The return value is also GenericValue. Let's print it. print "returned", retval.as_int() returned 142

f_add就是一个动态生成的机器码函数,我们可以把它想象成C语言编译之后的函数。在上面的程序中,我们通过ee.run_function调用此函数,而实际上我们还可以获得它的地址,然后通过Python的ctypes模块调用它。

首先通过ee.get_pointer_to_function获得f_add函数的地址:

addr = ee.get_pointer_to_function(f_add) addr 2975997968L

然后通过ctypes.PYFUNCTYPE创建一个函数类型:

import ctypes f_type = ctypes.PYFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_int)

***通过f_type将函数的地址转换为可调用的Python函数,并调用它:

f = f_type(addr) f(100, 42) 142

numba所完成的工作就是:

解析Python函数的ast语法树并加以改造,添加类型信息;

将带类型信息的ast语法树通过llvmpy动态地转换为机器码函数,然后再通过和ctypes类似的技术为机器码函数创建包装函数供Python调用。

到此,关于“怎么让Python运行速度提高100倍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么让Python运行速度提高100倍

本文链接: https://www.lsjlt.com/news/286515.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么让Python运行速度提高100倍
    这篇文章主要介绍“怎么让Python运行速度提高100倍”,在日常操作中,相信很多人在怎么让Python运行速度提高100倍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么让Python运行速度提高100倍...
    99+
    2023-06-17
  • python运行速度怎么提高
    有几种方法可以提高Python的运行速度: 使用适当的数据结构:选择合适的数据结构可以提高程序的效率。例如,使用字典而不是列表来...
    99+
    2023-10-25
    python
  • python怎么提高运行速度
    以下是一些提高Python运行速度的方法:1. 使用更高效的算法:优化算法可以显著提高程序的运行速度。通过选择更适合问题的算法,可以...
    99+
    2023-09-08
    python
  • 怎么提高python运行速度
    提高Python程序的运行速度有以下几个方法:1. 使用更高效的算法和数据结构:选择适当的算法和数据结构可以大大提高程序的运行速度。...
    99+
    2023-09-04
    python
  • 怎么让python处理速度翻倍
    本篇内容主要讲解“怎么让python处理速度翻倍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么让python处理速度翻倍”吧!进程在面试的时候,我们都会记住一个概念,进程是系统资源分配的最小...
    99+
    2023-06-02
  • 利用numba让python速度提升百倍
    目录一、什么是numba?二、numba适合科学计算三、学习使用numba四、numba让python飞起来前言; python由于它动态解释性语言的特性,跑起代码来相比java、c...
    99+
    2024-04-02
  • 电脑运行速度怎么提高
    以下是一些提高电脑运行速度的方法: 清理磁盘空间:删除不需要的文件和程序,清理浏览器缓存和临时文件。 禁用启动项:禁用不必要...
    99+
    2023-10-20
    电脑
  • 只需要这一行代码就能让python计算速度提高十倍
    目录一、前言二、Python的JIT编译器三、Numba快速学习四、关于使用五、实验提升一、前言 Python语言近年来人气爆棚。它广泛应用于数据科学,人工智能,以及网络安全问题中,...
    99+
    2024-04-02
  • win7怎么提高电脑运行速度
    本文小编为大家详细介绍“win7怎么提高电脑运行速度”,内容详细,步骤清晰,细节处理妥当,希望这篇“win7怎么提高电脑运行速度”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。win7提高电脑运行速度的方法:及时清...
    99+
    2023-07-01
  • 怎么提高电脑的运行速度
    这篇文章主要为大家展示了“怎么提高电脑的运行速度”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么提高电脑的运行速度”这篇文章吧。1.硬盘我们可以使用SSD固态硬盘作为系统盘可以让开机速度变快,...
    99+
    2023-06-28
  • CSS怎么让页面渲染速度提升数倍
    本篇内容介绍了“CSS怎么让页面渲染速度提升数倍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!浏览器在接收到服务端返回的 HTML 之后,需...
    99+
    2023-06-27
  • 虚拟主机运行速度怎么提高
    要提高虚拟主机的运行速度,可以考虑以下几个方面:1. 优化网站代码:确保网站代码精简、高效,减少不必要的资源消耗,优化数据库查询语句...
    99+
    2023-08-26
    虚拟主机
  • 怎么提高win10系统的运行速度
    提高win10系统运行速度的方法:1.右键此电脑选择属性;2.点击高级系统设置;3.点击性能设置;4.点击更改虚拟内存;5.填写初始大小和最大值;具体步骤如下:首先,在计算机桌面中右键点击“此电脑”选择“属性”选项;在弹出的系统页面中,点击...
    99+
    2024-04-02
  • 只用3行代码,让Python提速4倍!最
    Python是一门非常适合处理数据和自动化完成重复性工作的编程语言。我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调整几十万张图像的尺寸,用Python没问题!你几乎总是能找...
    99+
    2023-01-31
    代码 Python
  • 如何提高电脑运行速度
    提高电脑运行速度有以下几种方法:1. 清理磁盘空间:删除不需要的文件和程序,清理临时文件,释放硬盘空间,可以提高电脑的运行速度。2....
    99+
    2023-09-07
    电脑
  • 怎么提升python代码的运行速度
    这篇文章给大家介绍怎么提升python代码的运行速度,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写...
    99+
    2023-06-14
  • Win7系统运行速度变慢怎么办?提高运行速度的几个小方法
     如果我们的w7比较慢怎么办呢,自己的电脑出现了运行越来越慢的时候上网的时候会让你觉得非常的烦恼,大家都希望自己能够有一个好的运行速度,有些情况下是因为显卡不能负荷了,有时候我们是可以通过一些卸载或者是清理可以让我们的电...
    99+
    2023-06-13
    Win7系统运行速度变慢怎么办? 提高运行速度方法 运行 速度 系统 Win7 方法
  • Python如何提高查找字串的运行速度
    这篇文章主要介绍“Python如何提高查找字串的运行速度”,在日常操作中,相信很多人在Python如何提高查找字串的运行速度问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python如何提高查找字串的运行速度...
    99+
    2023-06-17
  • 怎么让电脑运行速度更快
    以下是一些方法可以帮助电脑运行速度更快:1. 清理磁盘空间:删除不需要的文件和程序,清理磁盘空间可以提高电脑的运行速度。2. 升级硬...
    99+
    2023-09-08
    电脑
  • 如何提高服务器运行速度
    提高服务器运行速度的方法:1、将服务器的硬件配置进行升级;2、将服务器上不必要的端口以及服务器进行关闭;3、对服务器应用程序的源代码编译进行简化;4、优化Web服务器和数据库服务器,从而加快服务器的运行速度。具体内容如下:1、硬件升级这可能...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作