草庐IT

python - 将 C(或 C++)与 Python 连接起来有哪些不同的选项?

coder 2023-08-14 原文

我知道有很多方法可以将 C 函数接口(interface)到 Python:Python C API , scipy.weave , ctypes , pyrex/cython , SWIG , Boost.Python , Psyco ... 他们每个人最擅长的是什么?为什么我应该使用给定的方法而不是其他方法?当我需要选择 Python 和 C 之间的绑定(bind)时应该考虑什么?

我知道一些关于那个的讨论,但它们似乎都不完整......

我知道 StackOverflow 上的一些问题也是相关的。例如:

最佳答案

虽然我曾经研究过所有这些方法,但我并没有使用过所有这些方法...

Python C API:用于编写编译为可在 Python 中导入的 Python 模块的 C 代码。或者用于编写充当“胶水”代码以与某些 C 库交互的 Python 模块。

scipy.weave:如果您使用 NumPy 和 SciPy 进行数值运算,可以让您将一些 C 代码插入到您的 Python 代码中,请查看此内容。 C 代码将是一个字符串,例如 weave.inline('printf("%s", foo)')。

ctypes:一个 python 模块,允许您从 python 代码调用 C 代码。您基本上导入共享库,然后调用它的 API。需要做一些工作来整理进出这些调用的数据。如果您正在考虑使用您或其他人编写的现有 C 库,我会从这里开始。

pyrex/cython:允许您编写 Python 代码(使用一些特殊语法),这些代码将生成为 C 代码(可以作为 Python 模块导入),并且显然运行速度比如果它是通过 Python 解释器运行的。这有点像“Python C API”路由,只是它会为您生成 C 代码。如果您有一些代码块是您的瓶颈并且非常慢,则很有用。使用 cython 重写该函数并从调用代码中导入它。

SWIG:为 C/C++ 库生成包装器代码。您应该最终得到一个可以导入和使用的 python 模块。

Boost.Python:这是我了解最少的一个。在我看来,它类似于 SWIG,尽管您自己编写了包装层,但在 Boost 宏/函数的帮助下得到了很多帮助。

Psyco:稍微加速你的 python 代码,我从来没有在这方面有太多的运气。我不会浪费你的时间。分析您的代码,找到您的瓶颈并使用上述技术之一加速它们。

关于python - 将 C(或 C++)与 Python 连接起来有哪些不同的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6587407/

有关python - 将 C(或 C++)与 Python 连接起来有哪些不同的选项?的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  4. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  5. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  6. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐