为什么主要的可运行Python脚本未编译为pyc文件(如模块)? - python

我了解,当您导入模块时,该文件会被编译成.pyc文件以使其更快?为什么主文件也未编译为.pyc?这会减慢速度吗?那么将主文件保持得尽可能小会更好,还是没关系?

参考方案

加载模块时,会将py文件“字节编译”为pyc文件。时间戳记录在pyc文件中。
这样做不是为了使其运行更快,而是使其加载更快。
因此,在加载模块时使用“字节编译”模块是有意义的。

  • http://docs.python.org/tutorial/modules.html#compiled-python-files
  • [编辑:包括注释,参考文献]

    从PEP 3147上的“字节码
    汇编”:

    CPython将其源代码编译为“字节码”,出于性能原因,
    每当源文件发生更改时,它将在文件系统上缓存此字节代码。
    由于编译阶段,这使得Python模块的加载速度更快
    可以绕开。当您的源文件是foo.py时,CPython会缓存该字节
    源代码旁边的foo.pyc文件中的代码。

    字节码编译文件如何
    根据Python版本进行跟踪
    和“py”文件更改:

    它还在已编译的字节码“.pyc”文件中插入一个幻数。
    每当Python更改字节码格式时(通常在主要版本中),这种情况都会改变。
    这样可以确保为早期版本的VM构建的pyc文件不会引起问题。
    时间戳用于确保pyc文件与之前的py文件匹配
    用于创建它。如果幻数或时间戳不匹配,
    py文件将重新编译并写入新的pyc文件。

    “pyc”文件在Python主要版本之间不兼容。当Python找到pyc
    具有不匹配的幻数的文件,它会退回到速度较慢的
    重新编译源代码。

    这就是原因,如果您仅分发为同一平台编译的“.pyc”文件,则在python版本更改的情况下将无法再使用。

    简而言之

    如果有一个字节的已编译文件“.pyc”,并且时间戳指示该文件是最新的,则它将被加载,否则,明智的python将以较慢的方式加载“.py”文件。 “.py”文件的执行性能不会受到影响,但是“.pyc”文件的加载要比“.py”文件快。

    考虑执行导入b.py的a.py

    Typical total performance = loading time (A.py) + execution time (A.py) + 
                                loading time (B.py) + execution time (B.py) 
    
    Since loading time (B.pyc)  <  loading time (B.py)
    
    You should see a better performance by using the byte compiled "pyc" files. 
    

    就是说,如果您有一个大型脚本文件X.py,则将其模块化并将内容移动到其他模块将导致字节码编译文件的加载时间减少。

    另一个推断是,模块往往比脚本或主文件更稳定。因此,它根本不是字节编译的。

    参考文献

  • http://effbot.org/zone/python-compile.htm
  • http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html
  • 在Django中聚合save()? - python

    我正在使用带有sqlite后端的Django,并且写入性能是一个问题。在某个阶段,我可能会毕业于“适当的”数据库,但是目前我仍然坚持使用sqlite。我认为我的写入性能问题可能与以下事实有关:我创建了大量行,并且大概每次save()一个行时,它都会锁定,解锁和同步磁盘上的数据库。如何将大量save()调用聚合到一个数据库操作中? 参考方案 编辑:不建议使用c…

    如何在Linux上安装2个Anacondas(Python 2.7和3.5)? - python

    我想使用Python 2和3版本。我已经读过有关conda环境的用法,但是不断向终端source (de)activate py27写入内容似乎不方便。如picture所示,如何使用命令选择内核版本? 参考方案 您在该图像中寻找的是Jupyter Notebook。您需要使用Jupyter和所需的python版本创建环境:conda create -n py…

    为什么在for循环中将单词从复数形式转换为单数形式会花费这么长时间(Python 3)? - python

    这是我的代码,用于从CSV文件读取文本并将一列中的所有单词从复数形式转换为单数形式:import pandas as pd from textblob import TextBlob as tb data = pd.read_csv(r'path\to\data.csv') for i in range(len(data)): blob …

    如何在“后台”中运行脚本的一部分(单个函数)? - python

    我在具有以下基本结构(伪代码)的服务器上运行python脚本:for data_item in data_items: processed_result=process_data(data_item); #this takes time T0 upload_result_to_site(processed_result) #this takes time T…

    为什么在Python中根据@staticmethod选择模块级别的函数(根据Google样式指南)? - python

    根据《 Google Python样式指南》,绝对不应(几乎)使用静态方法: 除非为了与 在现有库中定义的API。编写模块级功能 代替该建议背后的原因是什么?这是否仅适用于Google?还是在Python中使用静态方法还有其他(更一般的)缺点?尤其是,如果我想在将由该类的其他公共成员函数调用的类中实现实用程序功能,则最佳实践是什么?class Foo: ..…