精华内容
下载资源
问答
  • 对于Python很多人还是比较了解的,虽然说Python多优势但同样具有劣势,Python最大的劣势就是运行效率,那么如何提高Python代码运行速度呢?这五种方法管用。1、PyPy:在选择CPython的简易替代语言时,pypy...

    对于Python很多人还是比较了解的,虽然说Python有很多优势但同样具有劣势,Python最大的劣势就是运行效率慢,那么如何提高Python代码运行速度呢?这五种方法很管用。

    1、PyPy:在选择CPython的简易替代语言时,pypy无疑时最佳之选,与现有Python代码保持高度兼容性,pypy也是默认程序运行时的一个很好选择。PyPy使用了Just-in-Time即时编译器,动态编译器与静态编译器不同,利用程序运行的过程的数据进行优化。

    2、Pyston:是一款Dropbox推出的新的基于JIT的Python实现,使用LLVM编译器实现代码解析与转换。

    3、Nuitka:是一个Python的替代品,它可以将Python代码转换为C++代码,然后编译为可执行文件,并且通过调用Python的API的方式实现从解析语言到编译语言的转换,在转换到C++的过程中直接使用python的解释器,可以保证100%的语法兼容。

    4、Cython:是Python的C语言扩展,cPython是一门单独的语言,专门用来写在Python里面的import用的扩展库。CPython跟Python语法基本一致,而CPython有专门的编译器。

    5、Numba:是CPython竞争项目,Numba把Python源码通过LLVMPy生成JIT后的.so文件来加速。它以JIT为主的,加速对源码的侵入性较小,而CPython侧重点在加速高性能模块的开发上,不依赖LLVMPy项目。

    展开全文
  • 对于Python很多人还是比较了解的,虽然说Python多优势但同样具有劣势,Python最大的劣势就是运行效率,那么如何提高Python代码运行速度呢?这五种方法管用。1、PyPy:在选择CPython的简易替代语言时,pypy...

    对于Python很多人还是比较了解的,虽然说Python有很多优势但同样具有劣势,Python最大的劣势就是运行效率慢,那么如何提高Python代码运行速度呢?这五种方法很管用。

    1、PyPy:在选择CPython的简易替代语言时,pypy无疑时最佳之选,与现有Python代码保持高度兼容性,pypy也是默认程序运行时的一个很好选择。PyPy使用了Just-in-Time即时编译器,动态编译器与静态编译器不同,利用程序运行的过程的数据进行优化。

    2、Pyston:是一款Dropbox推出的新的基于JIT的Python实现,使用LLVM编译器实现代码解析与转换。

    3、Nuitka:是一个Python的替代品,它可以将Python代码转换为C++代码,然后编译为可执行文件,并且通过调用Python的API的方式实现从解析语言到编译语言的转换,在转换到C++的过程中直接使用python的解释器,可以保证100%的语法兼容。

    4、Cython:是Python的C语言扩展,cPython是一门单独的语言,专门用来写在Python里面的import用的扩展库。CPython跟Python语法基本一致,而CPython有专门的编译器。

    5、Numba:是CPython竞争项目,Numba把Python源码通过LLVMPy生成JIT后的.so文件来加速。它以JIT为主的,加速对源码的侵入性较小,而CPython侧重点在加速高性能模块的开发上,不依赖LLVMPy项目。

    展开全文
  • Python这门语言相较于其他的语言是更容易理解的,但是相比较于其他的语言的运行速度是的。那么这是为什么呢?首先先和大家讲一下编译器和解释器是什么。计算机不能直接理解任何除机器语言以外的语言,这里机器语言...

    Python这门语言相较于其他的语言是更容易理解的,但是相比较于其他的语言的运行速度是慢的。

    那么这是为什么呢?

    首先先和大家讲一下编译器和解释器是什么。

    计算机不能直接理解任何除机器语言以外的语言,这里机器语言也就是(0、1),所以必须要把程序员所写的程序语言翻译成机器语言,计算机才能执行程序。将其他语言翻译成机器语言的工具,被称为编译器,编译器翻译的方式有两种:一个是编译,另外一个是解释。两种方式之间的区别在于翻译时间点的不同。当编译器以解释方式运行的时候,也称之为解释器,同理了当编译器以编译方式运行的时候,也称之为编译器。

    那么现在就这种编译时运行的原理:

    就如同上面的这样图片,先说一下编译性语言,比如C、C++等属于编译性语言,首先开发者在开发环境内完成一个程序的源代码后,然后把这个源码统一交给编译器,然后由编译器一起进行翻译成机器语言并且生成一个可执行文件,当我们要执行这个文件时,我们只需双击图标。(比如C语言的可执行文件就是以xxx.h,C++的可执行文件就是以xxx.cpp)。

    C++进行编写的1+2=3的程序

    接下来就说一说解释性语言,当然编译性语言和解释性语言并没有太大的差别,都是首先由开发者在开发环境内完成一个程序的源代码后,假如我们现在写了三行代码,

    Python编写的1+2=3的程序

    就如上图所示,使用Python编写了一个十分简单的1+2=3的程序,就用了三行代码完成,现在就来解释一下解释性语言运行的的原理,首先解释性语言是逐句的进行解释,把这三句代码丢给解释器,解释器按照从上到下的顺序进行逐句的解释,也就是先把a=1解释成机器语言,然后再把解释成的机器语言丢给CPU去执行,CPU执行的同时解释器再把b=2解释成机器语言,依次类推直到程序结束。这就是解释性语言的特点。

    由此可见编译性语言是统一编译,一次性执行;而解释器语言是翻译一行执行一行。

    正是由于这样的存在,才会使Python的运行时间变慢。因为,当我们需要去执行一个文件时,CPU只需去调用生成的可执行文件,此时就不需要进行编译了,而对于解释性语言,当我们需要去执行一个文件时CPU需要去翻译一行执行一行。因此Python的运行速度就变慢了。

    当然这样也有好处,就是Python可以快平台运行,也就是假如我们是在Windows操作平台下用Python编写的程序,可以运行。到了其他操作平台如Linux、Mac也可以运行;但是我们在Windows操作平台下编译性编写的程序,可以运行。但是到了其他操作平台如Linux、Mac就不可以运行了,这时就需要我们重新的进行编写。

    展开全文
  • 作者:Anthony Shaw 是 Python 软件基金会成员和 Apache 基金会成员。 近来Python可谓人气骤升。...答案大程度上取决于你运行的应用程序的类型。没有哪个基准测试程序尽善尽美,不过The Computer...

    作者:Anthony Shaw 是 Python 软件基金会成员和 Apache 基金会成员。

    近来Python可谓人气骤升。这门编程语言用于开发运维(DevOps)、数据科学、网站开发和安全。

    然而,它没有因速度而赢得任何奖牌。

    Java在速度方面与C、C++、C#或Python相比如何?答案很大程度上取决于你运行的应用程序的类型。没有哪个基准测试程序尽善尽美,不过The Computer Language Benchmarks Game(计算机语言基准测试游戏)是个不错的起点。

    十多年来,我一直提到计算机语言基准测试游戏;与Java、C#、Go、Java和C++等其他语言相比,Python是速度最慢的语言之一。除了Java等解释语言外,这还包括JIT(C#和Java)以及AOT(C和C++)编译器。

    注意:我说“Python”时,其实指这种语言的参考实现:CPython。我会在本文中提到其他运行时环境。

    我想回答这个问题:Python运行完成类似的应用程序比另一种语言慢2倍至10倍时,为什么它这么慢,我们能不能让它更快些?

    下面是几种常见的说法:

    • “它是GIL(全局解释器锁)”
    • “这是由于它是解释的,而非编译”
    • “这是由于它是一种动态类型语言”

    那么,到底上述哪个原因对性能带来的影响最大?

    “它是GIL”

    现代计算机搭载拥有多个内核的CPU,有时搭载多个处理器。为了利用所有这些额外的处理能力,操作系统定义了一种名为线程的低级结构:一个进程(比如Chrome浏览器)可能生成多个线程,并拥有针对内部系统的指令。这样一来,如果某个进程特别耗费CPU资源,该负载可以在诸多核心之间分担,这实际上让大多数应用程序更快地完成任务。

    我在写这篇文章时,我的Chrome浏览器有44个线程开着。请记住这点:线程的结构和API在基于POSIX的操作系统(比如Mac OS和Linux)与Windows OS之间是不同的。操作系统还处理线程的调度。

    如果你之前没有从事过多线程编程,需要尽快熟悉的一个概念就是锁(lock)。与单线程进程不同,当你需要确保改变内存中的变量时,多个线程并不同时试图访问/改变同样的内存地址。

    CPython创建变量时,它会分配内存,然后计算该变量的引用有多少,这个概念名为引用计数(reference counting)。如果引用数为0,那么它从系统释放这部分内存。这就是为什么在某个代码段(比如for循环的范围)内创建一个“临时”变量不会搞砸应用程序的内存消耗。

    当变量在多个线程内共享时,就出现了这个难题:CPython如何锁定引用计数。有一个“全局解释器锁”,它小心地控制线程执行。解释器一次只能执行一个操作,无论它有多少线程。

    这对Python应用程序的性能来说意味着什么?

    如果你有单线程、单个解释器的应用程序,这对速度不会有影响。删除GIL根本不会影响你代码的性能。

    如果你想通过使用线程机制在单个解释器(Python进程)内实现并发功能,而且线程是IO密集型(比如网络IO或磁盘IO),你会看到GIL争夺的后果。

    上图来自大卫•比兹利(David Beazley)撰写的《GIL可视化》文章:http://dabeaz.blogspot.com/2010/01/python-gil-visualized.html

    如果你有Web应用程序(比如Django),又在使用WSGI,那么针对Web应用程序的每个请求都是一个单独的Python解释器,所以每个请求只有一个锁。由于Python解释器启动缓慢,一些WSGI实现拥有“守护进程模式”,这可以让一个或多个Python进程为你保持活跃状态。

    其他Python运行时环境怎么样?

    PyPy有一个GIL,它通常比CPython快3倍。

    Jython之所以没有GIL,是由于Jython中的Python线程由Java线程表示,受益于JVM内存管理系统。

    Java如何执行此任务?

    好吧,首先所有Java引擎都使用标记-清除(mark-and-sweep)垃圾收集机制。如上所述,GIL的主要需求是CPython的内存管理算法。

    Java没有GIL,但它也是单线程的,所以它不需要内存管理算法。Java的事件循环和承诺回调(Promise/Callback)模式是实现异步编程以代替并发的方法。Python与asyncio事件循环有相似之处。

    “这是由于它一种解释语言”

    我常听到这个观点,但觉得这过于简化了CPython的实际工作方式。如果你在终端上编写了python my.py,那么CPython会启动读取、分析、解析、编译、解释和执行代码的一长串操作。

    如果你对这个过程的机理颇感兴趣,我之前写过一篇文章:《6分钟内修改Python语言》(https://hackernoon.com/modifying-the-python-language-in-7-minutes-b94b0a99ce14)。

    这个过程的一个重要节点是创建.pyc文件;在编译阶段,字节码序列写入到Python 3中__pycache__/里面的一个文件或Python 2中的同一个目录。这不仅适用于你的脚本,还适用于导入的所有代码,包括第三方模块。

    所以在大部分时间(除非你编写的是只运行一次的代码?),Python解释字节码,并在本地执行。相比之下Java和C#.NET:

    Java编译成一种“中间语言”,Java虚拟机读取字节码,并即时编译成机器码。.NET CIL也一样,.NET公共语言运行时环境(CLR)使用即时编译,将编译后代码编译成机器码。

    那么,既然都使用虚拟机和某种字节码,为什么Python在基准测试中比Java和C#都要慢得多呢?首先,.NET和Java是JIT编译型的。

    JIT或即时编译需要一种中间语言,以便将代码拆分成块(或帧)。提前(AOT)编译器旨在确保CPU在任何交互发生之前能理解每一行代码。

    JIT本身不会使执行变得更快,因为它仍然执行相同的字节码序列。然而,JIT让代码在运行时能够加以优化。一个好的JIT优化器会看到应用程序的哪些部分在频繁执行,这些代码称之为“热点代码”(hot spot)。然后,它会对这些代码进行优化,其办法是把它们换成更高效的版本。

    这就意味着当你的应用程序一次又一次地执行相同的操作时,运行速度可以显著加快。另外记住一点:Java和C#是强类型语言,因此优化器可以对代码做出多得多的假设。

    PyPy有JIT,如上所述,其速度比CPython快得多。这篇性能基准测试文章作了更详细的介绍:《哪个Python版本的速度最快?》(https://hackernoon.com/which-is-the-fastest-version-of-python-2ae7c61a6b2b)。

    那么,CPython为什么不使用JIT呢?

    JIT存在几个缺点:缺点之一是启动时间。CPython的启动时间已经比较慢了,PyPy的启动时间比CPython还要慢2倍至3倍。众所周知,Java虚拟机的启动速度很慢。.NET CLR通过系统开启时启动解决了这个问题,但CLR的开发人员还开发了操作系统,CLR在它上面运行。

    如果你有一个Python进程长时间运行,代码因含有“热点代码”而可以优化,那么JIT大有意义。

    然而,CPython是一种通用实现。所以,如果你在使用Python开发命令行应用程序,每次调用CLI都得等待JIT启动会慢得要命。

    CPython不得不试图满足尽可能多的用例(use case)。之前有人试过将JIT插入到CPython中,但这个项目基本上搁浅了。

    如果你想获得JIT的好处,又有适合它的工作负载,不妨使用PyPy。

    “这是由于它是一种动态类型语言”

    在“静态类型”语言中,你在声明变量时必须指定变量的类型。这样的语言包括C、C++、Java、C#和Go。

    在动态类型语言中,仍然存在类型这个概念,但变量的类型是动态的。

    在这个示例中,Python创建了一个有相同名称、str类型的第二个变量,并释放为a的第一个实例创建的内存。

    静态类型语言不是为了给你添堵而设计的,它们是兼顾CPU的运行方式设计的。如果一切最终需要等同于简单的二进制操作,你就得将对象和类型转换成低级数据结构。

    Python为你这么做这项工作,你永远看不到,也不需要操心。

    不必声明类型不是导致Python速度慢的原因,Python语言的设计使你能够让几乎一切都是动态的。你可以通过猴子补丁(monkey-patch),加入对运行时声明的值进行低级系统调用的代码。几乎一切都有可能。

    正是这种设计使得优化Python异常困难。

    为了说明我的观点,我将使用可在Mac OS中使用的一种名为Dtrace的系统调用跟踪工具。CPython发行版并未内置DTrace,所以你得重新编译CPython。我使用3.6.6进行演示。

    现在python.exe将在整个代码中使用Dtrace跟踪器。保罗•罗斯(Paul Ross)写了一篇关于Dtrace的杂谈(https://github.com/paulross/dtrace-py#the-lightning-talk)。你可以下载Python的DTrace启动文件(https://github.com/paulross/dtrace-py/tree/master/toolkit)来测量函数调用、执行时间、CPU时间、系统调用和各种好玩的指标。比如

    py_callflow跟踪器显示你应用程序中的所有函数调用。

    那么,Python的动态类型会让它变慢吗?

    • 比较和转换类型的开销很大,每次读取、写入或引用一个变量,都要检查类型。
    • 很难优化一种极具动态性的语言。Python的许多替代语言之所以快得多,原因在于它们为了性能在灵活性方面作出了牺牲。
    • Cython 结合了C-Static类型和Python来优化类型已知的代码,可以将性能提升84倍。

    结论

    Python之所以速度慢,主要是由于动态性和多功能性。它可用作解决各种问题的工具,Python有更优化、速度更快的几个替代方案。

    然而,有一些方法可以优化你的Python应用程序,比如通过充分利用异步、深入了解分析工具以及考虑使用多个解释器。

    对于启动时间不重要、代码会受益于JIT的应用程序来说,不妨考虑PyPy。

    对于性能至关重要,又有更多静态类型变量的部分代码而言,不妨考虑使用Cython。

    本文转载自:https://465914.kuaizhan.com/36/57/p543294672f5b80

    展开全文
  • Python是一个酷的语言,因为你可以在短的时间内利用少的代码做多事情。不仅如此,它还能轻松地支持多任务,比如多进程等。Python批评者有时会说Python执行缓慢。本文将尝试介绍6个技巧,可加速你的Python...
  • 我的认知是很多人对于Python这门语言有或多或少的误解,今天我就从底层逻辑的角度来简单说明一下Python为什么不比C类语言(C,C++,C#等)运行速度。 首先我们应该理解一点,Python语言本身的多库也是基于C类语言...
  • @[TOC](python graphic define grid very slow (note)) In [2]: #1.10自定义网格线 import numpy as np import matplotlib.pyplot as plt %pylab inline x1,x2,y1,y2 = (-10,140,10,90) plt.grid(False) plt....
  • 这条理由我也听过多,我发现它过于简化了 CPython 的实际工作原理。当你在终端上写 python myscript.py 时,CPython 会启动一长串操作,包括读取、词法分析、语法分析、编译、解释以及执行。 如果你对这些过程感...
  • 请注意,这有点夸张。首先,我要说明我是专业从事python工作的...是的,我们都知道python很慢。但是我们也知道,通常会使事情变慢的不是语言,而是算法。是的,与C语言相比,python语言的运行速度非常慢,但这并不是...
  • 为啥Python运行速度这么

    万次阅读 2018-08-06 16:52:00
    作者:Anthony Shaw 是 Python 软件基金会成员和 Apache 基金会成员。 近来 Python 可谓人气骤升。这门编程语言用于开发...答案大程度上取决于你运行的应用程序的类型。没有哪个基准测试程序尽善尽美,不过 The ...
  • 为啥 Python 运行速度这么

    万次阅读 2018-07-25 22:31:21
    作者:Anthony Shaw 是 Python 软件基金会成员和 Apache 基金会成员。   近来Python可谓人气骤升。...答案大程度上取决于你运行的应用程序的类型。没有哪个基准测试程序尽善尽美,不过The Co...
  • 大约在一年前,也就是2013年在Waza(地名),Alex Gaynor提到了一个很好的话题:为什么用Python、Ruby和Javascript写的程序总是运行很慢呢?正如他强调的,关键就是现在出现了这个问题。换一句话说,尽管现在这种...
  • 大约在一年前,也就是2013年在Waza(地名),Alex Gaynor提到了一个很好的话题:为什么用Python、Ruby和Javascript写的程序总是运行很慢呢?正如他强调的,关键就是现在出现了这个问题。换一句话说,尽管现在这种...
  • 因为它是GIL(全局解释器锁) ...这样如果一个进程是要使用多 CPU,那么计算负载就会由多个核心分担,最终使得绝大多数应用能更快地完成任务。 在撰写本文时,我的 Chrome 浏览器开了 44 个线程...
  • Python运行是历来被诟病的,一方面和语言有关,另一方面可能就是你代码的问题。语言方面的问题我们解决不了,所以只能在编程技巧上来提高程序的运行效率。下面就给大家分享几个提高运行效率的编程方法。首先,...
  • 关于Python Sklearn SVM 为什么运行很慢得到结果的原因

    万次阅读 多人点赞 2019-03-28 21:28:07
    但当碰到需要区分一个人的高矮,而给出的数据是他喜欢玩英雄联盟or吃鸡的数据时,你就难找出他们的联系,这个时候SVM选择的核函数是线性函数去区分这堆数据时,SVM也会无语,尽管计算了多次,还是找不出区别,也...
  • Python代码简洁干净,但是大家都知道Python运行起来相对较 --- 在CPU密集型的任务上于C、Java和Javascript(但是大多数服务都不是CPU密集型的)--- 但是有些团队希望Python是尽善尽美的,所以他们准备从内而外地...
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,...Python代码简洁干净,但是大家都知道Python运行起来相对较 --- 在CPU密集型的任务上于C、Java和Javascript(但是大多数服务都不是CP.
  • 是的,我们都知道python很慢。但是我们也知道,通常会使事情变慢的不是语言,而是算法。 是的,与C语言相比,python语言的运行速度非常慢,但这并不是python速度慢的99%。 Python之所以缓慢,是因为许多(即使不是...
  • 在使用python运行同样的东西的时候,有时候比java和c慢很多,在有些情况下python 的运行速度比c100-200倍。 具体是什么原因,其实原因不过有两点:边解释边运行和GIL(全局解释器锁) 边解释边运行 因为pyhon 是一个...
  • 几个方法帮你加快Python运行速度

    万次阅读 多人点赞 2019-05-28 16:25:42
    Python运行是历来被诟病的,一方面和语言有关,另一方面可能就是你代码的问题。语言方面的问题我们解决不了,所以只能在编程技巧上来提高程序的运行效率。下面就给大家分享几个提高运行效率的编程方法。 首先,...
  • Python运行速度提升

    千次阅读 2018-09-21 21:11:37
    相比较C,C++,python一直被抱怨运行速度很慢,实际上python的执行效率并不慢,而是解释器Cpython运行效率很差。 通过使用numba库的jit可以让python运行速度提高百倍以上。 同诺简单累加,相乘的例子,可以看出...
  • 【导读】一直以来,诟病 Python语言的人经常说,他们不想使用的一个原因是 Python 的速度太了。不管使用哪一种编程语言,程序运行速度的快慢在大程度上还是取决于编写程序的开发人员,以及他们编写高效程序的...
  • Python代码简洁干净,但是大家都知道Python运行起来相对较 — 在CPU密集型的任务上于C、 Java和Javascript(但是大多数服务都不是CPU密集型的)— 但是有些团队希望Python是尽善尽美的, 所以他们准备从内而外地...
  • 写出了正确的多线程代码,运行速度反而比单线程慢很多,原来是由于GIL(Global Interpreter Lock)! GIL 是Cpython(Python语言的主流解释器)特有的全局解释器锁(其他解释器因为有自己的线程调度机制,所以没有GIL...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 981
精华内容 392
关键字:

python运行很慢

python 订阅