1. 聚能聊>
  2. 话题详情

一行代码让python的运行速度提高100倍,你信吗?

python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。

“一行代码让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模块。

那么问题来了:
1、你知道 numba 吗?为啥numba库的jit模块那么牛掰?

2、Python你可能不了解,其它语言有类似功能的库或者组件吗?

3、它们提高性能的原理是什么?你还知道哪些提高性能的方法?

参与话题

奖品区域 活动规则 已 结束

  • 奖品一

    阿里云代金券 x 5

  • 奖品二

    云栖帽衫 x 1

  • 奖品三

    定制保温杯 x 1

25个回答

1

北方的郎 已获得云栖帽衫 复制链接去分享

1、你知道 numba 吗?为啥numba库的jit模块那么牛掰?
Python 本身由于其动态语言的本质,并不适合于计算量很大的科学计算。然而 Numpy 提供的带类型的数据结构,以及预编译好的基于 C 或 Fortran 的高速计算库,很大程度上解决了这个问题。绝大部分基于 Python 的科学计算程序,都是将其数据储存在 ndarray 里的。按我自己目前的认识,Numpy 至少带来了两个方面的好处,一是存储的数据带有类型,Python 不再需要动态地猜测变量的数据类型;二是提供了一系列高速的 ufunc,可以快速地对大规模的数组进行运算操作。
Numpy 提供的 ndarray 以及 ufunc 在有些情况下是足够应付一些简单的计算逻辑的,比如 Palabos 官网提供的圆柱绕流的代码。按 Palabos 自己的说法,这个代码短得惊人,而且速度也非常快。

但是,总会有一些情况是用简单的数组没法完成的。至少有两种典型的情况。其一是沿时间的迭代,后一步依赖前一步的结果。即使每一个时间步中的计算量都不大,但所有的时间步不能或者很难做成一个简单的数组计算。另一种情况是确实是基于数组的计算,但计算逻辑比较复杂,没法用简单的数组算式来完成,比如 LBM 中的碰撞迁移如果有非规则障碍物就很难用数组简单表达了。

jit 的全称是 Just-in-time,在 numba 里面则特指 Just-in-time compilation(即时编译)。

2、Python你可能不了解,其它语言有类似功能的库或者组件吗?
JIT:Just In Time Compiler,一般翻译为即时编译器,这是是针对解释型语言而言的,而且并非虚拟机必须,是一种优化手段,Java的商用虚拟机HotSpot就有这种技术手段,Java虚拟机标准对JIT的存在没有作出任何规范,所以这是虚拟机实现的自定义优化技术。

    HotSpot虚拟机的执行引擎在执行Java代码是可以采用【解释执行】和【编译执行】两种方式的,如果采用的是编译执行方式,那么就会使用到JIT,而解释执行就不会使用到JIT,所以,早期说Java是解释型语言,是没有任何问题的,而在拥有JIT的Java虚拟机环境下,说Java是解释型语言严格意义上已经不正确了。

    HotSpot中的编译器是javac,他的工作是将源代码编译成字节码,这部分工作是完全独立的,完全不需要运行时参与,所以Java程序的编译是半独立的实现。有了字节码,就有解释器来进行解释执行,这是早期虚拟机的工作流程,后来,虚拟机会将执行频率高的方法或语句块通过JIT编译成本地机器码,提高了代码执行的效率,至此你已经了解了JIT在Java虚拟机中所处的地位和工作的主要内容。

3、它们提高性能的原理是什么?你还知道哪些提高性能的方法?
主要是预编译。很多啦,跟具体的语言相关,比如Python:
1-使用内建函数:
2-使用 join() 连接字符串.
3-使用Python多重赋值,交换变量
4-尽量使用局部变量
....

1

海阔天空yy 已获得定制保温杯 复制链接去分享

1、你知道 numba 吗?为啥numba库的jit模块那么牛掰?
jit 的全称是 Just-in-time,在 numba 里面则特指 Just-in-time compilation(即时编译)
jit会在某种程度上“预编译”你的代码,这意味着它会在某种程度上固定住各个变量的数据类型;
2、Python你可能不了解,其它语言有类似功能的库或者组件吗?
我记得好像nodejs,angular都提供了一些预编译的功能
3、它们提高性能的原理是什么?你还知道哪些提高性能的方法?
相当于,在代码运行前先做了预编译,运行的时候执行的是编译后的代码
就好比原来为啥 vb 比asp性能好的道理是一样的
python性能优化主要是以下几个方面
(1)改进算法,选择合适的数据结构
(2)对循环的优化
(3)充分利用 Lazy if-evaluation 的特性
(4)字符串的优化
(5)使用列表解析(list comprehension)和生成器表达式(generator expression)
当然还有其它方式,对一段程序的优化首先就要找到性能瓶颈,再针对性的优化
还有就是可以用一些优化工具:Psyco,Pypy,Cython

0

关羽大侠 已获得阿里云代金券 复制链接去分享

1、你知道 numba 吗?为啥numba库的jit模块那么牛掰?
没听过,还没用过python。
2、Python你可能不了解,其它语言有类似功能的库或者组件吗?
Java好像有。
3、它们提高性能的原理是什么?你还知道哪些提高性能的方法?
应该是利用了编译器的预编译功能。

关羽大侠 回复

求赐杯子

评论
0

浮生递归 已获得阿里云代金券 复制链接去分享

1、你知道 numba 吗?为啥numba库的jit模块那么牛掰?
Numba提供了由Python直接编写的高性能函数来加速应用程序的能力。通过几个注释,面向数组和数学计算较多的Python代码就可以被实时编译为原生机器指令。而且Numba拥有类似于C、C++和FORTRAN的性能,无需切换语言或Python解释器。

2、Python你可能不了解,其它语言有类似功能的库或者组件吗?
C#数值计算实现处理麻烦,Math.NET Numerics库可以大大提高C#数值能力,为处理数据提供极大便捷。该库旨在为科学,工程和日常使用中的数值计算提供方法和算法。涵盖的主题包括特殊函数,线性代数,概率模型,随机数,插值,积分,回归,优化问题等。

3、它们提高性能的原理是什么?你还知道哪些提高性能的方法?
Python 本身由于其动态语言的本质,并不适合于计算量很大的科学计算。然而 Numba提供的带类型的数据结构,以及预编译好的基于 C 或 Fortran 的高速计算库,很大程度上解决了这个问题。
实际生产场景中,更多的还是语句的优化更常见。一种好的语句设计,也能大幅提高速度。

0

aoteman675 已获得阿里云代金券 复制链接去分享

1、你知道 numba 吗?为啥numba库的jit模块那么牛掰?
Numba是一个库,可以在运行时将Python代码编译为本地机器指令,而不会强制大幅度的改变普通的Python代码。
jit模块有预编译处理的能力。
2、Python你可能不了解,其它语言有类似功能的库或者组件吗?
java语言有,JVM太慢了,需要即时(JIT)编译器来提高执行速度。
3、它们提高性能的原理是什么?你还知道哪些提高性能的方法?
基于JIT的虚拟机在执行之前,把所有字节码转换成机器码,但是以惰性方式来做这项工作:JIT只有在确定某个代码路径将要执行的时候,才编译这个代码路径。这个技术使程序能启动得更快,因为在开始执行之前,不需要冗长的编译阶段。

HotSpot动态编译:它没有把所有要执行的字节码转换成机器码,而是先以解释器的方式运行,只编译“热门”代码——执行得最频繁的代码。当HotSpot执行时,会搜集性能分析数据,用来决定哪个代码段执行得足够频繁,值得编译。

0

wangccsy 已获得阿里云代金券 复制链接去分享

1、你知道 numba 吗?为啥numba库的jit模块那么牛掰?
这个还真不太了解。因为使用Python的时候还是不多,基本上不用。jit模块达到的是即时编译的效果,在运行时编译成机器码或者中间码,运行速度肯定是比解析执行速度要快。
2、Python你可能不了解,其它语言有类似功能的库或者组件吗?
.Net,Java等都是先编译为中间码,运行时再通过JIT解析为机器码执行,达到了跨平台运行的新金瓶梅。
3、它们提高性能的原理是什么?你还知道哪些提高性能的方法?
这个不了解。

0

1311638352825690 复制链接去分享

总是学不会python只能通过培训班学吗

微wx笑 回复

总是学不会?学只是一方面,用才是关键。培训班花钱了可以让你少走点弯路。

sdew 回复

我不认为培训是好事情,所有的东西,用的话很快就会了,建议找个python的工作或者尝试做个python的项目,慢慢来。有人担心面试不过,去看看面试题吧,软件的面试最恶心的地方就是问的很多时候用不到,工作中用的很多时候是最基本的,还有思维灵活性也是很大的决定性因素。

微wx笑 回复
回复@sdew:

确实是这样的。

评论
0

1746359681557781 复制链接去分享

涨知识

微wx笑 回复

金不换 回复
评论
0

来一点幽默 复制链接去分享

我知道一行代码可以让python的运行速度提高,但是有没有100倍暂且不知,因为我没有具体测试过,我对自己没有亲自测试确认过的事情从不说信或不信。

wangccsy 回复

我试了一下这个代码,在DELL T3600(36G内存,4核E5-1650)下,是近200倍的提高。第一个10s多,第二个0.05s多点。

来一点幽默 回复

嗯,不错!

评论
0

1396426217191227 复制链接去分享

nice

0

x-hacker 复制链接去分享

不应该是我们提问,作者回答吗😊

0

牧羊小人 复制链接去分享

之前接触过Python,函数库确实很强大

0

angry_ape 复制链接去分享

  1. 它们提高性能的原理是什么?

原理是从解释执行优化为编译执行

0

1917539904569497 复制链接去分享

厉害啊

0

慕容愠斐 复制链接去分享

能让python的运行速度提高的代码我知道,但是提升一百倍这个还真不好说

0

~浑蛋~ 复制链接去分享

没有cmath模块是什么情况

0

过了即是客 复制链接去分享

原来如此,numba这些Python计算库我还真没接触过,目前还在学习web框架中……

0

1486339850548127 复制链接去分享

收了

0

1613971308600565 复制链接去分享

看不懂,教我下

0

哈格个 复制链接去分享

我是新手,看了这个学习到了。

2
5229
浏览
1
收藏
邀请他人互动
关注
102
粉丝
182
话题
74

简介:

无知人生,记录点滴。 不积跬步,无以至千里;不积小流,无以成江海…… 订阅号:微wx笑, 个人站点:http://www.wei-xiao.top/, CSDN博客:http://blog.csdn.net/testcs_dn
提供一种性能卓越、稳定、安全、便捷的计算服务,帮助您快速构建处理能力出色的应用,解放计算给服务带来的压力,使您的...

Node.js 性能平台(Node.js Performance Platform)是面向中大型 Node.js...

CDN
是将源站内容分发至全国所有的节点,缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性,解决网络带宽...

为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...