天天看點

python代碼優化案例分析

第一版舉例:

1

2

3

4

5

6

7

8

9

10

11

12

<code>def</code> <code>displayNumType(num):</code>

<code>    </code><code>print</code> <code>num,</code><code>"is"</code><code>,</code>

<code>    </code><code>if</code> <code>type</code><code>(num)</code><code>=</code><code>=</code><code>type</code><code>(</code><code>0</code><code>):</code>

<code>        </code><code>print</code> <code>'an interger'</code>

<code>    </code><code>elif</code> <code>type</code><code>(num)</code><code>=</code><code>=</code><code>type</code><code>(</code><code>0L</code><code>):</code>

<code>        </code><code>print</code> <code>'a long'</code>

<code>    </code><code>elif</code> <code>type</code><code>(num)</code><code>=</code><code>=</code><code>type</code><code>(</code><code>0.0</code><code>):</code>

<code>        </code><code>print</code> <code>'a float'</code>

<code>    </code><code>elif</code> <code>type</code><code>(num)</code><code>=</code><code>=</code><code>type</code><code>(</code><code>0</code><code>+</code><code>0j</code><code>):</code>

<code>        </code><code>print</code> <code>'a complex number'</code>

<code>    </code><code>else</code><code>:</code>

<code>        </code><code>print</code> <code>'not a number at all!!'</code>

最終版舉例:

<code>    </code><code>print</code> <code>num,</code><code>'is'</code><code>,</code>

<code>    </code><code>if</code> <code>isinstance</code><code>(num,(</code><code>int</code><code>,</code><code>long</code><code>,</code><code>float</code><code>,</code><code>complex</code><code>)):</code>

<code>        </code><code>print</code> <code>'a  number of type:'</code><code>,</code><code>type</code><code>(num).__name__</code>

優化思路:

1、減少函數調用的次數

在第一版代碼中,每次判斷會調用兩次type()。

優化方式:

<code>import</code> <code>types</code>

<code>if</code> <code>type</code><code>(num)</code><code>=</code><code>=</code><code>types.IntType...</code>

2、對象值比較 VS 對象身份比較

type(0),type(42)等都是同一個對象“&lt;type 'Int'&gt;”,沒有必要進行值得比較。因為每一個類型隻有一個類型對象。

<code>if</code> <code>type</code><code>(num) </code><code>is</code> <code>types.IntType...  </code><code>##or type(0)</code>

3、減少查詢次數

為了得到整數的對象類型,解釋器不得不首先查找types這個子產品的名字,然後在該子產品的字典中查找IntType。

通過使用from-import,可以減少一次查詢。

<code>from</code> <code>types </code><code>import</code> <code>IntType</code>

<code>if</code> <code>type</code><code>(num) </code><code>is</code> <code>IntType</code>

4、慣例和代碼風格

isinstance()函數讓if語句更友善,并具有更好的可讀性。

<code>if</code> <code>isinstance</code><code>(num,</code><code>int</code><code>)...</code>

摘選自《python核心程式設計(第二版)》第四章P68

<b></b>

<b>本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/2050529</b><b>,如需轉載請自行聯系原作者</b>