代码之家  ›  专栏  ›  技术社区  ›  fear_matrix

python中的优化技术

  •  11
  • fear_matrix  · 技术社区  · 14 年前

    最近我用python/django为公司开发了一个计费应用程序。几个月来,一切都很好,但现在我发现,由于越来越多的用户使用该应用程序,性能正在下降。现在的问题是,应用程序现在对财务团队非常关键。现在,财务团队正为解决我的业绩问题而努力。我别无选择,只能想办法提高计费应用程序的性能。

    你们知道python中的任何性能优化技术吗,这些技术将真正帮助我解决可伸缩性问题

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

    是的,我们使用的是html、css和javascript

    9 回复  |  直到 14 年前
        1
  •  4
  •   fortran    14 年前

    python的一个令人惊讶的特性是pythonic代码非常高效……所以有几个一般的提示:

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

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

    • 使用 O(n) (或更好)算法!否则,您的系统无法线性扩展。
    • 编写支持多处理器的代码。在某个时候,你需要投入更多的计算能力,你的软件必须准备好使用它!
        2
  •  11
  •   Bite code    14 年前

    正如我在评论中所说的,您必须从发现代码的哪个部分是慢的开始。

    没有这些信息谁也帮不了你。

    您可以使用 Python profilers 然后带着结果回去找我们。

    如果是网络应用,第一个嫌疑犯通常是数据库。如果它是一个微积分密集型的gui应用程序,那么首先看看计算算法。

    但请记住,性能问题是非常不直观的,因此,客观的评估是唯一的途径。

        3
  •  6
  •   rytis    14 年前

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

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

    通过这样做,a)你将消除财务团队施加的压力(我知道他们会让你很痛苦)b)你和你的客户都会清楚你所说的“绩效”是什么意思c)你会有一个基础,你可以衡量你的进展,最重要的是d)你会有一些商定的时间来实施/解决性能问题。

    另外,看看索引…:)

        4
  •  2
  •   user177800    14 年前

    在你能“修复”一些东西之前,你需要知道什么是“坏的”。在软件开发中,这意味着分析,分析,分析。我有没有提到侧写。如果不进行分析,您就不知道cpu周期和挂钟时间的去向。正如其他人所说,要获得更多有用的信息,你需要发布整个堆栈的详细信息。python版本,用于存储数据的内容(mysql、postgres、平面文件等),web服务器接口cgi、fcgi、wsgi、passenger等,如何生成html、css和假设javascript。然后你就可以得到更具体的答案。

        5
  •  1
  •   Dacav    14 年前

    你可能对 this document 我很久以前就发现了。 作为个人建议,尽可能多地使用蟒蛇: 懒惰的评价 是关键字,所以要学会使用迭代器和生成器。

        6
  •  0
  •   Community uzul    7 年前

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

    要解决这个问题,您需要找出瓶颈在您的应用程序中的位置,为此,您需要某种 profiler .

    一旦你发现了你的瓶颈,你将处于一个更好的位置。您可以评估常见问题的问题区域,包括:

    任何解决方案的细节都将取决于您发现的瓶颈的细节。

        7
  •  0
  •   Dan Olson    14 年前

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

    我曾经优化过一些python代码,最让我吃惊的是每个函数调用的成本是多少。如果最小化函数调用或用内置函数替换循环,则运行速度会快得多。

        8
  •  0
  •   David Wolever    14 年前

    这里有一些很好的建议,所以让我建议一个实现细节。我找到了 runprofileserver 命令位于 django-command-extensions 非常方便分析我的django代码。

        9
  •  0
  •   anijhaw    14 年前

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