【问题标题】:Performance of Python worth the cost?Python 的性能值得付出代价吗?
【发布时间】:2010-12-02 15:49:58
【问题描述】:

我正在考虑基于 PyFuzzy (Python) 或 FFLL (C++) 库实现模糊逻辑控制器。

我更喜欢使用 python,但我不确定它的性能在嵌入式环境中是否可以接受(ARM 或嵌入式 x86 proc 都 ~64Mbs 的 RAM)。

主要关注的是响应时间尽可能快(5hz+ 的更新速率是理想的 >2Hz 是必需的)。该系统将从一个 RS232 端口读取多个(可能是 5 个)传感器,并根据模糊评估的结果提供 2/3 的输出。

我是否应该担心 Python 对这项任务来说太慢了?

【问题讨论】:

  • 我建议在您的特定平台上使用简单的原型进行测试。
  • 如果您需要与设备进行任何人工交互,那么 5 Hz 的响应时间并不是非常快。

标签: python c embedded fuzzy-logic


【解决方案1】:

一般来说,在您真正看到它成为一个问题之前,您不应该过于关注性能。由于我们不知道您的应用程序的详细信息,因此我们无法说明如果用 Python 实现它会如何执行。既然你还没有实现它,你也不能。

首先实施您最熟悉并且可以最快实施的版本。然后对其进行基准测试。 如果太慢了,你有三个选项应该按顺序完成:

  • 首先,优化您的 Python 代码
  • 如果这还不够,请用 C/C++ 编写对性能最关键的函数,然后从 Python 代码中调用它
  • 最后,如果您真的需要顶级性能,您可能必须用 C++ 重写整个内容。但至少你会在 Python 中拥有一个工作原型,并且你会对应该如何实现它有一个更清晰的想法。您将知道要避免哪些陷阱,并且您将拥有一个已经正确的实现来测试和比较结果。

【讨论】:

  • 是万恶之源,全是栈溢出。
  • 在所有方面都同意 jalf。此外,如果大部分工作将通过库调用完成,那么您是从 C 还是从 Python 调用库并不重要。如果您使用 Python 的内置语言功能和 C 库模块,您甚至可能永远不会注意到 Python 的性能下降;如果你尝试用原生 Python 或类似的东西编写自己的 FFT,你会看到糟糕的性能。使用 Python 编写真正高级的部分,并尝试让 Python 和 C 库完成繁重的工作。
  • @tkadlubo:我没有使用那句话,因为人们经常误解它。性能很重要,优化很重要。 Knuth 的观点很简单,在您的大部分代码中,优化没有任何收获,除非您知道代码的哪些部分是瓶颈,否则任何优化尝试都为时过早。不幸的是,人们常常以此为借口忽视性能和优化。
  • @jalf:我的观点是性能总是至关重要的,但是在不同的情况下使用不同的性能指标。通常,开发人员的时间是最稀缺的优化资源。
  • 这是真的(该死的 15 个字符限制)
【解决方案2】:

Python 在处理大量非字符串数据时非常缓慢。对于某些操作,您可能会发现它比 C/C++ 慢 1000 倍,所以是的,您应该对此进行调查并进行必要的基准测试,然后再使用 Python 进行时间关键算法。

但是,您可以使用 C/C++ 代码中的模块来扩展 python,这样时间关键的事情会很快,同时仍然可以将 python 用于主要代码。

【讨论】:

  • +1 作为基准,我也会尝试用 python 编写它,并在需要时用 C 替换慢速部分。
【解决方案3】:

让它工作,然后让它快速工作。

【讨论】:

  • 我把“让它正常工作”放在我对完成的定义中。但我听到了。
【解决方案4】:

如果您的大部分运行时都花在 C 库中,那么您用来调用这些库的语言并不重要。你的时间消耗库是用什么语言编写的?

【讨论】:

    【解决方案5】:

    根据您的描述,速度应该不是什么大问题(您可以使用 C、cython 等任何您想要让它更快的东西),但内存会是。对于最大 64 Mb 的环境(操作系统和所有环境也应该适合,对吗?),我认为 python 很可能不是目标部署的正确工具。

    如果你有不平凡的逻辑要处理,我仍然会在 python 中进行原型设计。

    【讨论】:

      【解决方案6】:

      我从未真正测量过 pyfuzzy 示例的性能,但新版本 0.1.0 可以像 FFLL 一样读取 FCL 文件。只需以这种格式描述您的模糊系统,编写一些包装器,然后检查两种变体的性能。

      要使用 pyfuzzy 读取 FCL,您需要 antlr python 运行时,但在读取后您应该能够腌制读取的对象,因此您不需要目标上的 antlr 开销。

      【讨论】:

        猜你喜欢
        • 2011-08-03
        • 2018-04-20
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 2015-03-18
        • 1970-01-01
        相关资源
        最近更新 更多