全新升級的Python 3.1版本簡介
在新推出的Python 3.1版本中,我們用一組插件來實現一些具有統一接口的功能,我們使用Python來代替動態鏈接庫形式的插件,他的重點與我這一專欄的觀點有些相反,它提供了 Python 和 Lisp 之間非常好的常規比較。
同時在性能方面也有所改善。在上一篇中,我們為讀者詳細介紹了Python 3.1版本在標準程序庫方面的變化,本文則要為讀者介紹新版本在性能方面的改善。在Python 3.1的開發計劃中,很大一部分都是關于性能的。
那么這一版本發布后,都是哪些性能得到改善呢?下面我們將一一加以介紹。Python 3.0曾以使用Python實現了一個新的I/O庫而引以為豪,但是其性能大家可想而知——和您估計的一樣,非常的低。
在Python 3.1版本中,人們利用C語言重新實現了此程序庫,所以它的性能得到了極大的提升,大概快了2到20倍。為此。我們寫了一段代碼:向一個文件中寫入5,000,000字節的內容,連續寫入10次,然后計算其平均耗時。我們分別在Python 2.5、2.6、3.0和3.1下運行該代碼,然后比較其結果。
看到這樣的結果,是不是既讓人感興趣又讓人很困惑呀:對于這個向文件逐字節寫入的基本I/O任務,不同Python版本之間的性能差別是不是很明顯呢?Python 3.0的性能有了很大的下降。
這是可以理解的,原因前面已經提過。不過,Python 2.6的性能比Python 2.5低了50%,而Python 3.1的性能有
幾乎是Python 2.5的兩倍。
從中我們可以了解到些什么呢?首先,對于該任務Python 3.0的性能是慘不忍睹的,它寫入字符的耗時是寫入字節的兩倍,并且幾乎比Python 3.1的性能地了二十倍。 Python 2.5、2.6和3.1所用的時間大體相當。
從Python 2.x升級到Python 3.0的時候,Unicode的處理有了明顯的改善。以下程序將對一個存放在緩沖區的1,000,000個希伯來語單詞“shalom”在UTF-8和UTF-16之間來回進行編碼和解碼處理。此緩沖區總大小為五百萬字節。
- from __future__ import with_statement
- import sys
- import time
- def test_encode_decode():
- shalom = ' \u05dd\u05d5\u05dc\u05e9'
- text = shalom * 1000000
- start = time.time()
- texttext_utf8 = text.encode('utf-8')
- texttext_utf16 = text.encode('utf-16')
- assert text_utf8.decode() == text
- assert text_utf16.decode('utf-16') == text
- end = time.time() - start
- print (shalom, end)
- return end
- test = test_encode_decode
- if __name__=='__main__':
- times = [test() for i in range(10)]
- times.remove(max(times))
- times.remove(min(times))
- print('Average:', sum(times) / len(times))
在Python 3.1版本下運行此程序的時候,兩種的速度大體相當;然而,Python 3.0卻要快得多(大約快了5-6倍),而Python 3.1則要比Python 2.x快了近八倍,比Python 3.0快40%左右。
【編輯推薦】