【问题标题】:Selecting An Embedded Language选择嵌入式语言
【发布时间】:2011-01-07 09:43:41
【问题描述】:

我正在制作一个应用程序,该应用程序使用几种不同的算法(代理)分析一个或多个系列数据。我想到这些代理中的每一个都可以实现为单独的 Python 脚本,我在我的应用程序中使用 Python C API 或 Boost.Python 运行这些脚本。

我有点担心运行时开销 TBH,因为我正在执行一些非常繁重的数据处理,并且我不想每次模拟都等待几分钟。我通常会进行数十万甚至数百万次迭代,在这些迭代中我调用外部“代理”;我最好只是硬编码应用程序中的所有内容,还是可以容忍性能下降?

另外,除了 Python 之外,我还可以使用其他解释语言吗?

【问题讨论】:

  • 使用 Python/C API。我毫不后悔地在我的应用程序中使用它。

标签: c++ python perl performance lua


【解决方案1】:

是的,吨。 Lua 和 Python 似乎是最受欢迎的:

嵌入 Lua

嵌入 Python

嵌入 Tcl

嵌入 Ruby

嵌入 Perl

嵌入 JavaScript

周围有几十个 JavaScript 引擎,这只是一个例子。其中一些速度也快得吓人。

【讨论】:

  • 在我看来,Lua 可能是最完善的嵌入式语言,它是游戏开发的事实上的标准。
  • 确实,很简单。我自己没有嵌入它,而是在一个自定义的 Garry's Mod 模块中使用它,并使用 C API 来传递东西。这对我当时 15 岁的大脑(具有海绵的计算能力)来说已经足够简单了。
  • Tcl 可能会挑战 Lua 作为记录最完善的语言,尽管这是主观的。它的存在时间也比 Lua 长。它不像 lua 那样“热”,但至少同样好。
  • 随意添加到列表中。
  • Lua 的解释器比 Python 的小,但它最初是为进行配置而创建的,因此 Python 更不容易出错并且语法更健壮。它还极大地受益于 NumPy 进行数字运算,尽管添加这样的外部模块也会使嵌入 Python 成为一项更大的任务。
【解决方案2】:

Lua 的速度非常快。如果您需要更快的速度,请尝试LuaJIT,非常棒。

【讨论】:

    【解决方案3】:

    Tcl 从一开始就被设计为一种嵌入式语言。

    【讨论】:

    • 在我编辑时,答案与我的一部分相同。 +1明显的天才。 :-)
    • Lua 也是从头开始设计为一种嵌入式语言。
    • @lhf:是的,有几种语言是从头开始设计的。
    • 还有哪些其他语言是从头开始设计并嵌入的?
    【解决方案4】:

    我通常会进行数十万甚至数百万次迭代,在这些迭代中我调用外部“代理”

    性能下降将是明显的,也许是痛苦的。如果可以将数据放入数组中,并使用NumPy进行批量处理,应该会快很多。

    NumPy 使连续进行一百万次任何类型的算术运算变得超级容易。例如,对数组的每个元素求平方是这样的:

    >>> x = numpy.array([1, 2, 3, 4, 5, 6, 7])
    >>> x**2
    array([1, 4, 9, 16, 25, 36, 49])
    

    超级简单,这里的紧内循环其实是用C实现的。

    当然 NumPy 也可以进行更高级的数字运算。

    【讨论】:

      【解决方案5】:

      我相信tclRexx 都是为此目的而设计的。

      【讨论】:

        【解决方案6】:

        对于 python 的数百万次调用(我假设是 c++,因为你提到了 boost),是的:你会注意到性能下降。这可能很重要,也可能不重要——也许尝试新“代理”的速度增益会大于命中。 Python 确实有可能会有所帮助的快速数值库(例如 numpy),但您仍然会产生编组数据、调用 python、gil 等的开销。

        是的,您可以嵌入许多其他语言:查看 lua。另外,查看 swig.org,它可以连接到除 python 之外的许多其他语言。

        【讨论】:

          【解决方案7】:

          您可能可以使用 C++ 模板和运算符重载创建嵌入式语言,例如 ublas 或 ftensor 矩阵语言。我不认为 python 或其他解释语言适合进行数字运算/数据处理。

          【讨论】:

            猜你喜欢
            • 2011-09-05
            • 1970-01-01
            • 1970-01-01
            • 2010-12-19
            • 1970-01-01
            • 1970-01-01
            • 2023-04-07
            • 2011-04-20
            • 1970-01-01
            相关资源
            最近更新 更多