是什么让 C 比 Python 更快? [关闭]

2023-11-24

我知道这可能是一个非常明显的答案,而且我让自己暴露在无益的尖锐评论中,但我不知道答案,所以就这样吧。

如果 Python 在运行时编译为字节码,是否只是初始编译步骤需要更长的时间?如果是这样的话,那岂不是代码中的一小部分前期成本(即,如果代码运行很长一段时间,C 和 python 之间的差异会减少吗?)


这不仅仅是 Python 代码被解释的事实导致它变慢,尽管这肯定限制了你的速度。

如果以字节码为中心的观点是正确的,那么要使 Python 代码与 C 一样快,您所要做的就是用对函数的直接调用替换解释器循环,消除任何字节码,并编译生成的代码。但事实并非如此。您也不必相信我的话:您可以自己测试一下。 Cython 将 Python 代码转换为 C,但转换然后编译的典型 Python 函数并没有显示出 C 级别的速度。您所要做的就是查看一些由此生成的典型 C 代码来了解原因。

真正的挑战是多重调度(或者无论正确的行话是什么——我不能把它全部说清楚),我的意思是这样一个事实:a+b if a and b都知道是整数或浮点数可以在 C 中编译为一个操作,在 Python 中你必须做更多的事情来计算a+b(获取名称绑定的对象,通过__add__, etc.)

这就是为什么要使 Cython 达到 C 速度,您必须在关键路径中指定类型;这就是 Shedskin 如何使用(笛卡尔积)类型推断来加快 Python 代码的运行速度,从而从中提取出 C++ 代码;以及 PyPy 如何变得更快——JIT 可以关注代码的行为方式并专门研究类型等内容。每种方法都消除了动态性,无论是在编译时还是在运行时,以便它可以生成知道自己在做什么的代码。

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

是什么让 C 比 Python 更快? [关闭] 的相关文章

随机推荐

  • VSCode 的“打开文件夹时运行”任务中的“打开文件夹时”是什么意思?

    VSCode 去年添加了一项功能 打开文件夹时 自动运行任务 但是使用工作区时 打开文件夹时 是什么意思 具体来说 如果您打开一个工作区 将会 runOn folderOpen 任务运行 如果是这样 怎么办 我这么问是因为我将一个任务配置为
  • HTML5 向后兼容 XHTML 吗?

    简短的问题 我可以将现有 XHTML 1 0 网站的 DOCTYPE 更改为 HTML5 吗 这会导致任何问题吗 很长的故事 我们有一个用 ASP NET Webforms 编写的网站 由于它相当旧 默认的 DOCTYPE 设置为 XHTM
  • 使用他的 ClassType 来转换 TObject?

    我怎样才能让我的代码工作 我试图提出这个问题 但经过几次失败的尝试后 我认为你们通过查看代码会比阅读我的 解释 更快地发现问题 谢谢 setCtrlState memo1 edit1 button1 False procedure setC
  • 带参数的 Django 重定向()

    已经有人问过几个类似的问题 但在花了很长时间后我找不到问题的答案 在下面的代码中 当我使用参数 username 从 myView 重定向到 anotherView 时 它按预期工作正常 但我也需要在此重定向中包含 范围 参数 因为重定向后
  • Android 中强制通过扬声器输出声音

    Android 有没有办法强制通过手机扬声器输出 即使耳机已插入插孔 我知道必须有一种方法 因为当您打电话时 即使插孔中插入了耳机 您也可以让某人使用免提电话 您可以使用以下命令在系统范围内更改此设置AudioManager setSpea
  • oo问题-混合控制器逻辑和业务逻辑

    我不确定我是否使用 标准 术语 但这是我试图解决的一个基本的面向对象问题 我正在编写一个 Windows 窗体 我不需要表单事件处理程序中的逻辑 因此我只需从那里调用自定义对象 在自定义对象中 有两组逻辑 控制器 逻辑 决定需要完成什么以及
  • 编译器生成的默认构造函数会是公共的吗?

    当我写一个类的时候Widget java public class Widget int data String name 编译器生成的构造函数是public or default 公众会像 public class Widget int
  • HTML 中的方括号形成数组。只是传统的还是有意义的?

    我经常看到 特别是在 PHP 世界中 如果你想创建一个 FORM 数组 可以这样写
  • 如何将 Firebase 身份验证令牌传递给 webView 并在 Android 上注册通知

    我有一个 Firebase WebApp 它向用户提供信息 除了应用程序之外 我还需要通过 Firebase 云消息传递向使用 Android 应用程序的用户发送推送通知 目标 用户应该一次登录到应用程序 既可以注册通知 又可以通过 Web
  • Google 时间轴图表持续时间(以小时为单位)

    我正在使用 Google 时间线图表 即使持续时间超过一天 我也想以小时为单位显示持续时间 是否可以 谢谢 包含一千个样本的图像 展示了不同的行为1正如您所看到的 红色的持续时间是错误的 蓝色的持续时间是计算和打印的 没有配置选项更改工具提
  • 在哪里可以找到当前的 C 或 C++ 标准文档?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 对于许多问题 答案似乎可以在 标准 中找到 然而 我们在哪里可以找到它呢 最好是在线 谷歌搜索有时会让人感到徒劳 尤其是对于 C 标准 因为它们淹没在编程论坛上
  • C 中的外部指针和静态指针

    您好 静态和外部指针的用法是什么 如果它们存在的话 为了回答您关于何时可以使用它们的问题 举几个简单的例子 静态指针可用于实现始终向程序返回相同缓冲区的函数 并在第一次调用时分配它 char GetBuffer static char bu
  • Java错误:应该在名为[重复]的文件中声明

    这个问题在这里已经有答案了 我对 Java 相当陌生 并试图弄清楚如何解决以下错误 读取错误 CalculatorWithMemory java 1 class Calculator is public should be declared
  • 如何找到最近的标记 leaflet.js

    我想知道是否真的有某种方法可以使用 leaflet js 找到我位置附近的标记 我首先想到的是存储我所在位置的纬度和经度 然后迭代一系列纬度和经度标记 将它们放入一个数组中 然后对该数组进行排序 我不确定这是否是一个好的选择 因为如果地图上
  • 路由器在 NAT 中保留记录多长时间?这些记录可以重复使用来转发来自其他主机的请求吗?

    有一个答案以简单的方式解释了路由器如何将请求从本地网络转换到外部网络并返回 https superuser com questions 105838 how does router know where to forward packet
  • 在 winapi 中拖放

    我有一个纯 Winapi 应用程序 需要一些新功能 其中之一最好实现为两个列表 您可以在列表之间拖放 多个 元素 新功能可以仅限于单个对话框 实现这一点的最快方法是什么 一些想法 纯Winapi 是DetectDrag 提供这一对话框的单独
  • Gradle resValue 导致重复字符串资源

    我的 Android 清单文件定义应用程序名称如下 android label string app name res values strings xml 中存在 app name 的相应条目 现在 在我的 build gradle 中
  • 如何使 Python/Sphinx 文档对象属性仅在 __init__ 中声明?

    我有带有对象属性的 Python 类 这些属性仅在运行构造函数时声明 如下所示 class Foo object def init self base self basepath base temp for run in os listdi
  • 从 C# 中的枚举获取字符串名称

    我已经声明了一个枚举 如下所示 public enum State KARNATAKA 1 GUJRAT 2 ASSAM 3 MAHARASHTRA 4 GOA 5 从外部来源 我得到的状态值为 1 或 2 或 3 或 4 或 5 根据我得
  • 是什么让 C 比 Python 更快? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我知道这可能是一个非常明显