如何提高性能?

Posted

技术标签:

【中文标题】如何提高性能?【英文标题】:How to improve the performance? 【发布时间】:2010-06-22 05:00:36 【问题描述】:

我准备了一个关于制作软件应用程序的项目。除了执行速度很慢之外,它是完整的并且工作正常。我已经采取了几块代码并对其进行了优化..

我尝试了 psyco.. 即我安装了 psyco 并在我的代码顶部添加了两行

import psyco
psyco.full()

不知道这是否是使用 psyco 的方式。如果这是错误的。请告诉我如何使用psyco..因为我添加了这个并没有发现任何改进..

我已经尝试过分析,我知道代码行需要时间,但这些无法进一步优化并且是不可避免的代码行..

我还考虑过使用一些 python 包重写“c”中的代码的选项。但我在使用不属于基本 python 的附加 python 包时总是有非常糟糕的体验。

我正在使用python 2.6和windows vista..请告诉方法显着提高整个代码执行速度的方法..至少5倍..拜托..

我还没有在方法中编写我的代码,你之间的方法很少..没有main..

是的,因为很少有人认为我是 IO 绑定问题。因为我需要调用代码大约 500 次,这涉及每次调用打开和关闭至少 2 个文件。

当打开一个 .pm 文件时,它有两列,我只需要第一列,所以我将整个第一列复制到列表中并将其传递给函数以获取其行号,然后打开其他列文件以将该行号的元素放入列表中...

这是我想要的任务...我想将第一列的元素加载到列表中很费时间来纠正这个问题..

如何提高 IO 绑定瓶颈的性能

拼命寻求帮助

【问题讨论】:

您提到您知道哪些生产线表现不佳。也许您可以发布那些特定的行?我怀疑没有灵丹妙药可以自动将每个程序的性能提高五倍。 你应该发布一些代码(例如性能瓶颈部分) 以上所有内容同上。另外,请重新格式化问题,以便于阅读和理解。如果可以,我会,但我不能。 这是代码的一部分..还有另一部分也需要很多时间...我可以发布大约 200 行代码.. 【参考方案1】:

如果您可以切换到二进制文件格式,您可以获得更好的性能。您的大部分代码都在进行解析和字符串操作。你做了很多将字符串转换为浮点数的工作,这比你想象的要慢。

【讨论】:

请放一些代码让我更好地理解我的意思我明白你的意思但是作为一个新手不能为这些尝试你上面的建议做鳕鱼但它没有太大区别因为我不知道如何使 min func 在单个列表扫描中进行两次比较..因此我让它在一次调用中返回两个列表但在函数中只是重复相同的代码两次因此它没有做出任何改进..请举个例子代码。【参考方案2】:

仅通过调整代码,您不太可能看到 5 倍的性能差异。

首先,您应该考虑改进您的算法 - 您是否使用了最适合这项工作的数据结构?也许在正确的位置使用dictset 可以大大加快您的代码速度。

编写 C 模块并不难,如果您找不到改进 Python 代码的方法,这是另一种选择。通常你会期望使用 C 代码可以将速度提高 5 倍以上。

也许你的问题是 IO 绑定的。那你需要看看提高IO性能的方法

如果您在此处需要更多帮助,您可能需要展示一些代码或至少描述您的程序的功能。

更新: 看起来您正在打开和关闭大量文件,这些文件在 Windows 上往往非常缓慢。

【讨论】:

【参考方案3】:

psyco 可以像导入和调用 psyco.full() 一样简单地使用。所以你对你的 psyco 使用是正确的。

如果您尝试使用 C/C++ 构建 python 模块,请查看 boost::python

您确实应该发布您的代码以供进一步分析。

【讨论】:

【参考方案4】:

要优化代码以提高速度,您只需对其进行分析并查看问题所在。猜测没有帮助。但是一旦你知道在哪里,最划算的通常来自降序排列:改进算法、使用更合适的数据结构、消除资源瓶颈(io、内存、cpu)、减少内存分配、减少上下文切换(进程和子程序)。

【讨论】:

至于你的具体例子,可能有两个角度。我会看看您将数据存储在文件中并必须解析它们的方式。这很可能是 IO 问题。另一个角度是您使用的 split 和 line.partition 方法。这些速度出奇的慢。 你能告诉我这些拆分和分区的任何替代方案以适应我的任务吗?请..我是新手,不知道完整的功能 对不起,我不太了解 python 语法或库 - 可怕的语言 - 但在 perl 中,我使用 substr 调用获得了显着的性能提升。但我会按照 dmazzoni 的说法,切换到二进制格式并一起避免所有这些字符串操作。【参考方案5】:

这是优化的一个机会:您调用 get_list 两次,参数非常相似:

join_cost_index_end[index] = get_list(file, float(abs1), fout)
join_cost_index_strt[index] = get_list(file, float(abs2), fout)

这意味着 get_list 中的大部分工作无缘无故地重复了两次。重写它,让 get_list 被调用一次,并让它同时返回 index_end 和 index_strt。

【讨论】:

这不会有任何区别,直到我更改获取列表功能以仅扫描一次列表...但我猜我使用的 min() 无法手动操作,以便我可以进行比较在单个文件扫描并返回两个变量的最小值..如果可能,请输入一些代码以便我能理解..【参考方案6】:

为什么机器人只是尝试使用 cython?您应该在不更改任何代码的情况下获得更好的性能。稍加修改,这应该会有所帮助。

【讨论】:

是的,这就是我所希望的,请您更具体地说明如何使用和实施这些以及有哪些小的修改...而不是仅仅含糊地回答...如果您使用过请告诉我是否需要安装或如何使用...thnq 我不是来做你的工作的,我给了你一个提示,现在搜索 cython 并阅读文档。 Cython 并不难理解和使用...... 我没有要求你做我的工作......我只是征求建议......你怎么能只说一点修改就离开它......如果你知道它们是什么,不提什么修改...... .如果你不是来帮助其他人的,那为什么要来这里..不要只是为了增加你在SO的声誉而给出这样的答案......只提供数千个可用的包中的一个包,并提供任何有关它的信息..如果每个人都建议一个包作为答案......它会是什么。我来这里不是为了打一场战争。我们是来互相帮助的。所以“和平”。在我给出答案之前提高你的代表分数“比如我不是来这里工作的”

以上是关于如何提高性能?的主要内容,如果未能解决你的问题,请参考以下文章

java中大量数据如何提高性能?

如何提高 Sql server 中 Distinct Query 的性能

如何提高应用性能?

如何提高datapump操作性能

如何提高此视图/查询的性能?

如何提高 dataadapter.fill 的性能?