我正在比較我的舊PHP腳本與更新的Django版本和PHP版本,全部吐出HTML並且所有功能都運行得更快。 Django上的某些東西必須是錯誤的地方要快得多。Django(?)在執行一些python分析之後真的很慢,數據集很大
首先,一些上下文:我有一個頁面,吐出銷售數據的報告。數據可以被許多事物過濾,但大部分都是按日期過濾的。這使得緩存它有點難,因爲結果的可能性幾乎是無窮無盡的。有很多數字和計算都完成了,但在PHP中處理問題從來都不是問題。
更新:
經過一些額外的測試,這正是我認爲,導致經濟放緩之內什麼都沒有。如果我只是簡單地對數據進行數字處理並分發出5行呈現的HTML,那麼速度並不慢(但仍然比PHP慢),但如果我呈現大量數據,則速度非常慢。
每當我運行一個大型報告(例如全年的所有銷售量)時,機器的CPU使用率將達到100%。不知道這是否意味着很多。我正在使用mod_python和Apache。也許切換到WSGI可能有幫助?
我的模板標籤顯示真正大集合的小計/總計過程從0.1秒到1秒的任意位置。我在報告中稱他們約6次,所以他們似乎不是最大的問題。現在
,我跑了Python的探查和帶回來的結果:
Ordered by: internal time List reduced from 3074 to 20 due to restriction ncalls tottime percall cumtime percall filename:lineno(function) 2939417 26.290 0.000 44.857 0.000 /usr/lib/python2.5/tokenize.py:212(generate_tokens) 2822655 17.049 0.000 17.049 0.000 {built-in method match} 1689928 15.418 0.000 23.297 0.000 /usr/lib/python2.5/decimal.py:515(__new__) 12289605 11.464 0.000 11.464 0.000 {isinstance} 882618 9.614 0.000 25.518 0.000 /usr/lib/python2.5/decimal.py:1447(_fix) 17393 8.742 0.001 60.798 0.003 /usr/lib/python2.5/tokenize.py:158(tokenize_loop) 11 7.886 0.717 7.886 0.717 {method 'accept' of '_socket.socket' objects} 365577 7.854 0.000 30.233 0.000 /usr/lib/python2.5/decimal.py:954(__add__) 2922024 7.199 0.000 7.199 0.000 /usr/lib/python2.5/inspect.py:571(tokeneater) 438750 5.868 0.000 31.033 0.000 /usr/lib/python2.5/decimal.py:1064(__mul__) 60799 5.666 0.000 9.377 0.000 /usr/lib/python2.5/site-packages/django/db/models/base.py:241(__init__) 17393 4.734 0.000 4.734 0.000 {method 'query' of '_mysql.connection' objects} 1124348 4.631 0.000 8.469 0.000 /usr/lib/python2.5/site-packages/django/utils/encoding.py:44(force_unicode) 219076 4.139 0.000 156.618 0.001 /usr/lib/python2.5/site-packages/django/template/__init__.py:700(_resolve_lookup) 1074478 3.690 0.000 11.096 0.000 /usr/lib/python2.5/decimal.py:5065(_convert_other) 2973281 3.424 0.000 3.424 0.000 /usr/lib/python2.5/decimal.py:718(__nonzero__) 759014 2.962 0.000 3.371 0.000 /usr/lib/python2.5/decimal.py:4675(__init__) 381756 2.806 0.000 128.447 0.000 /usr/lib/python2.5/site-packages/django/db/models/fields/related.py:231(__get__) 842130 2.764 0.000 3.557 0.000 /usr/lib/python2.5/decimal.py:3339(_dec_from_triple)
tokenize.py出來放在上面,它可以使一些感覺,因爲我做了很多的一些格式。 Decimal.py很有意義,因爲報告基本上是90%的數字。我不知道內置方法match
是什麼,因爲我沒有在自己的代碼中執行任何正則表達式或類似的東西(Something Django正在做什麼?)最接近的是我正在使用itertools ifilter。
看來這些是主要的罪魁禍首,如果我能想出如何減少那些處理時間,那麼我會有一個更快的頁面。
有沒有人有任何建議,我可以開始減少?我真的不知道如何解決這個令牌/小數問題,而不是簡單地刪除它們。
更新:我在大多數數據上運行了一些帶/不帶過濾器的測試,並且結果時間幾乎相同,後者速度稍快但不是問題的原因。 tokenize.py究竟發生了什麼?
如果沒有您的視圖代碼和分析指導,建議您不可能提供有用的信息。 – 2009-07-23 19:30:19
亞歷克斯:我的觀點很簡單。它提取了一個初始條目列表,然後如果報告被修改,它會添加一些過濾器。這就是它。然後,我的模板將數據集重新分組爲兩部分,然後循環遍歷它,沿途調用模板標籤(但我已經將模板標籤的時間定在0.1 - > 0.5秒內執行。這些模板標籤是報告的小計/總計所以對於大量的數據來說執行時間是可以的。) – Bartek 2009-07-23 19:50:26
@Bartek:請不要評論你自己的問題。這是你的問題,你可以更新它來包含所有相關的事實。 – 2009-07-23 20:04:43