Python中的优化技术

时间:2010-03-30 14:07:48

标签: python

最近我用Python / Django为我的公司开发了一个计费应用程序。几个月来一切都很好,但现在我观察到由于越来越多的用户使用该应用程序,性能正在下降。现在问题是应用程序现在对财务团队非常关键。现在,财务团队正在追寻性能问题。我没有其他选择,只能找到一种方法来提高计费应用程序的性能。

那么你们是否知道python中的任何性能优化技术将真正帮助我解决可扩展性问题

我们正在使用mysql数据库,并将其托管在Linux机器上的apache web服务器上。其次我注意到的是,所有应用程序都很慢,而不是数据库事务部分。例如,一旦加载了应用程序,它就可以正常工作,但是如果它们导航到该应用程序上的其他链接,则需要花费很多时间。

是的,我们正在使用HTML,CSS和Javascript

9 个答案:

答案 0 :(得分:11)

正如我在评论中所说,你必须首先找到代码的哪一部分很慢。

没有这些信息,没人能帮助你。

您可以使用Python profilers对代码进行分析,然后返回结果。

如果它是一个Web应用程序,第一个嫌疑人通常是数据库。如果它是一个微积分密集型GUI应用程序,那么首先先看一下计算算法。

但请记住,对于汽车来说,汽车问题非常不直观,因此客观评估是唯一可行的方法。

答案 1 :(得分:6)

好吧,不完全是这一点,但在你开始修复之前,请确保每个人都了解情况。在我看来,他们给你施加了一些压力来解决“问题”。

首先,当您编写应用程序时,是否已指定性能要求?他们是否告诉你他们需要操作X才能完成不到Y秒的操作?它们是否指定了必须支持多少并发用户而不会对性能造成损害?如果没有,那么告诉他们退出并且它是迭代(阶段,阶段,无论什么)部署之一,主要目标是功能和测试。第二阶段是性能改进。让他们(显然有你的帮助)提出一些非功能性的系统性能要求。

通过这一切,a)你将消除财务团队施加的压力(我知道他们可能是一个真正的痛苦)b)你和你的客户都会清楚地知道你是什么意思是“表现”c)你将有一个基础,你可以衡量你的进度,最重要的是d)你将有一些约定的时间来实施/解决性能问题。

PS。除此之外,看看索引......:)

答案 2 :(得分:4)

Python的一个令人惊讶的特性是pythonic代码非常有效......所以一些一般提示:

  • 尽可能使用内置函数和标准函数,它们已经进行了很好的优化。
  • 尝试使用延迟生成器代替一次性临时列表。
  • 使用numpy进行矢量运算。
  • 如果在x86 32bit上运行,请使用psyco。
  • 用较低级别的语言(C,Pyrex,Cython等)编写性能关键循环。
  • 当调用对象集合的相同方法时,获取对类函数的引用并使用它,它将在对象字典中保存查找(这是一个微优化,不确定它是否值得)

当然,如果可扩展性至关重要:

  • 使用O(n)(或更好)算法!否则,您的系统无法进行线性扩展。
  • 编写多处理器感知代码。在某些时候,你需要增加更多的计算能力,你的软件必须准备好使用它!

答案 3 :(得分:2)

在你可以“修复”某些东西之前,你需要知道什么是“破碎”。在软件开发中,这意味着分析,分析,分析。我提到了剖析吗?如果没有分析,你就不知道CPU周期和挂钟时间在哪里。像其他人说过要获得更多有用的信息,您需要发布整个堆栈的详细信息。 Python版本,你用来存储数据(mysql,postgres,平面文件等),什么web服务器接口cgi,fcgi,wsgi,乘客等你如何生成HTML,CSS和假设Javascript。然后,您可以获得这些层级的更具体的答案。

答案 4 :(得分:1)

您可能对我前段时间发现的this document感兴趣。 作为个人建议,尽可能多地使用pythonic: lazy evaluation 是关键字,因此请学会使用迭代器和生成器。

答案 5 :(得分:0)

对于您所描述的应用程序类型(可能由数据库支持的Web应用程序),您的性能问题不太可能是特定于语言的。他们更有可能源于设计或架构问题,尽管它们也可能是简单的编码问题。

要对此进行排序,您需要确定应用程序中瓶颈的位置,并且您需要某种profiler

一旦找到了瓶颈,你就会处于更好的位置。您可以针对常见问题评估问题区域,包括:

任何解决方案的具体细节都取决于您发现的瓶颈的具体情况。

答案 6 :(得分:0)

http://wiki.python.org/moin/PythonSpeed/PerformanceTips

我一段时间后优化了一些python代码,对我来说最令人惊讶的是每个函数调用的成本。如果你最小化函数调用或用内置函数替换循环,你将运行得更快。

答案 7 :(得分:0)

这里有一些很棒的建议......所以让我建议一个实现细节。我发现在django-command-extensions中找到的runprofileserver命令非常方便用于分析我的Django代码。

答案 8 :(得分:0)

我不确定这是否能解决问题,但你应该看看psyco