如果 Python 是解释型的,那么 .pyc 文件是什么?

2024-02-19

Python 是一种解释型语言。但为什么我的源目录包含.pyc文件,Windows 将其识别为“编译的 Python 文件”?


我已经明白了 Python 是一种解释型语言...

这种流行的模因是不正确的,或者更确切地说,是建立在对(自然)语言水平的误解之上的:类似的错误是说“圣经是一本精装书”。让我解释一下这个比喻...

“圣经”是“一本书”,意思是它是一本书class(实际的、被识别为书籍的物理对象);被认定为“圣经副本”的书籍应该有一些基本的共同点(内容,尽管这些书籍可能采用不同的语言,具有不同的可接受的翻译、脚注和其他注释的级别)——然而,这些书是完全允许在许多方面有所不同not被认为是基本的——装订类型、装订颜色、印刷中使用的字体、插图(如果有)、可写边距是否宽、内置书签的数量和类型等等。

很有可能typical圣经的印刷确实会采用精装本——毕竟,这是一本通常需要一遍又一遍地阅读的书,在几个地方加了书签,翻阅寻找给定的章节和诗句指针,等等,等等,良好的精装装订可以使给定的副本在这种使用下保存更长时间。然而,这些都是平凡(实际)的问题,不能用来确定给定的实际书籍对象是否是圣经的副本:平装本印刷是完全可能的!

类似地,Python 是“一种语言”,它定义了一类语言实施它们在一些基本方面必须相似(语法,大多数语义,除了那些明确允许不同的部分),但完全允许在几乎每个“实现”细节上有所不同——包括它们如何处理他们获得的源文件,他们是否将源代码编译为某些较低级别的形式(如果是,是哪种形式 - 以及他们是否将此类编译的形式保存到磁盘或其他地方),他们如何执行所述形式,等等。

经典实现 CPython 通常简称为“Python”,但它只是几种生产质量实现之一,与 Microsoft 的 IronPython(编译为 CLR 代码,即“.NET”)、Jython 并列。 (编译为 JVM 代码)、PyPy(用 Python 本身编写,可以编译为各种“后端”形式,包括“即时”生成的机器语言)。它们都是 Python(==“Python 语言的实现”),就像许多表面上不同的书籍对象都可以是圣经(==“圣经的副本”)。

如果您对 CPython 特别感兴趣:它将源文件编译为 Python 特定的较低级别形式(称为“字节码”),并在需要时自动执行此操作(当没有与源文件对应的字节码文件时,或者字节码文件比源文件旧或由不同的Python版本编译),通常将字节码文件保存到磁盘(以避免将来重新编译它们)。 OTOH IronPython 通常会编译为 CLR 代码(是否将它们保存到磁盘,具体取决于),并将 Jython 编译为 JVM 代码(无论是否将它们保存到磁盘 - 它将使用.class扩展名(如果它确实保存了它们)。

然后,这些较低级别的形式由适当的“虚拟机”(也称为“解释器”)执行 - CPython VM、.Net 运行时、Java VM(又名 JVM)(视情况而定)。

因此,从这个意义上说(典型的实现做什么),Python 是一种“解释型语言”当且仅当 C# 和 Java 是:它们都具有首先生成字节码,然后通过 VM/解释器执行它的典型实现策略。

更有可能的是,焦点在于编译过程有多么“沉重”、缓慢和仪式感。 CPython 被设计为尽可能快地编译、尽可能轻量级、尽可能少的仪式——编译器很少进行错误检查和优化,因此它可以快速运行并占用少量内存,这反过来又让它在需要时自动、透明地运行,大多数时候用户甚至不需要知道正在进行编译。 Java 和 C# 通常在编译期间接受更多工作(因此不执行自动编译),以便更彻底地检查错误并执行更多优化。这是灰度的连续体,而不是黑色或白色的情况,并且在某个给定级别设置阈值并说只有高于该级别才将其称为“编译”是完全任意的!-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 Python 是解释型的,那么 .pyc 文件是什么? 的相关文章

  • 使用 Python 创建 MIDI

    本质上 我正在尝试从头开始创建 MIDI 并将它们放到网上 我对不同的语言持开放态度 但更喜欢使用Python 两种语言之一 如果这有什么区别的话 并且想知道我应该使用哪个库 提前致谢 看起来这就是您正在寻找的 适用于 Python 的简单
  • TensorFlow:带有轴选项的 bincount

    在 TensorFlow 中 我可以使用 tf bincount 获取数组中每个元素的计数 x tf placeholder tf int32 None freq tf bincount x tf Session run freq feed
  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • Python 使用 Gstreamer 访问 USB 麦克风时遇到问题,以便在 Raspberry Pi 上使用 Pocketsphinx 执行语音识别

    所以Python的表现就好像它根本听不到我的麦克风发出的任何声音 问题就在这里 我有一个Python 2 7 假设使用的脚本Gstreamer通过以下方式访问我的麦克风并为我进行语音识别口袋狮身人面像 我在用着脉冲音频我的设备是树莓派 我的
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • ImportError:运行 jupyter Notebook 时没有名为 IPython.paths 的模块?

    我通过以下方式安装了 jupyter usr local opt python bin python2 7 m pip install jupyter 这将安装 ipython 版本 4 1 2 但是 当我运行 jupyter Notebo
  • Python tkinter.filedialog Askfolder 干扰 clr

    我主要在 Spyder 中工作 构建需要弹出文件夹或文件浏览窗口的脚本 下面的代码在spyder中完美运行 在 Pycharm 中 askopenfilename工作良好 同时askdirectory什么都不做 卡住了 但是 如果在调试模式
  • 小部件之间的自定义信号

    尝试将信号从一个 gtk EventBox 子级发送到另一个 在 init HeadMode 第 75 行 上出现错误 类型错误 未知信号名称 消息发送 why usr bin env python coding utf8 import p
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • 根据 Pandas 中的列表对多列进行排序

    感谢有关如何根据 pandas 中的倍数列表对给定多列进行排序的任何提示 如下所示 import pandas as pd sort a a d e sort b s1 s3 s6 sort c t1 t2 t3 df pd DataFra
  • 更改 x 轴比例

    我使用 Matlab 创建了这个图 使用 matplotlib x 轴绘制大数字 例如 100000 200000 300000 我想要 1 2 3 和 10 5 之类的值来指示它实际上是 100000 200000 300000 有没有一
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • ValueError:不支持连续[重复]

    这个问题在这里已经有答案了 我正在使用 GridSearchCV 进行线性回归的交叉验证 不是分类器也不是逻辑回归 我还使用 StandardScaler 对 X 进行标准化 我的数据框有 17 个特征 X 和 5 个目标 y 观察 约11
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • 字符串列表,获取n个元素的公共子串,Python

    我的问题可能类似于this https stackoverflow com questions 37514193 count the number of occurrences of n length not given string in
  • OSX 上的 locale.getlocale() 问题

    我需要获取系统区域设置来执行许多操作 最终我想使用 gettext 翻译我的应用程序 我打算在 Linux 和 OSX 上分发它 但我在 OSX Snow Leopard 上遇到了问题 python Python 2 5 2 r252 60
  • 导入错误:无法导入名称“时间戳”

    我使用以下代码在 python 3 6 3 中成功安装了 ggplot conda install c conda forge ggplot 但是当我使用下面的代码将其导入笔记本时 出现错误 from ggplot import Impor
  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j
  • tkinter:打开一个带有按钮提示的新窗口[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 用户如何按下 tkinter GUI 中的按钮来打开新窗口 我只需要非常简单的解决方案 如果代码也能被解释那就太好了 这

随机推荐