全新升級(jí)的Python 3.1版本簡介
在新推出的Python 3.1版本中,我們用一組插件來實(shí)現(xiàn)一些具有統(tǒng)一接口的功能,我們使用Python來代替動(dòng)態(tài)鏈接庫形式的插件,他的重點(diǎn)與我這一專欄的觀點(diǎn)有些相反,它提供了 Python 和 Lisp 之間非常好的常規(guī)比較。
同時(shí)在性能方面也有所改善。在上一篇中,我們?yōu)樽x者詳細(xì)介紹了Python 3.1版本在標(biāo)準(zhǔn)程序庫方面的變化,本文則要為讀者介紹新版本在性能方面的改善。在Python 3.1的開發(fā)計(jì)劃中,很大一部分都是關(guān)于性能的。
那么這一版本發(fā)布后,都是哪些性能得到改善呢?下面我們將一一加以介紹。Python 3.0曾以使用Python實(shí)現(xiàn)了一個(gè)新的I/O庫而引以為豪,但是其性能大家可想而知——和您估計(jì)的一樣,非常的低。
在Python 3.1版本中,人們利用C語言重新實(shí)現(xiàn)了此程序庫,所以它的性能得到了極大的提升,大概快了2到20倍。為此。我們寫了一段代碼:向一個(gè)文件中寫入5,000,000字節(jié)的內(nèi)容,連續(xù)寫入10次,然后計(jì)算其平均耗時(shí)。我們分別在Python 2.5、2.6、3.0和3.1下運(yùn)行該代碼,然后比較其結(jié)果。
看到這樣的結(jié)果,是不是既讓人感興趣又讓人很困惑呀:對于這個(gè)向文件逐字節(jié)寫入的基本I/O任務(wù),不同Python版本之間的性能差別是不是很明顯呢?Python 3.0的性能有了很大的下降。
這是可以理解的,原因前面已經(jīng)提過。不過,Python 2.6的性能比Python 2.5低了50%,而Python 3.1的性能有
幾乎是Python 2.5的兩倍。
從中我們可以了解到些什么呢?首先,對于該任務(wù)Python 3.0的性能是慘不忍睹的,它寫入字符的耗時(shí)是寫入字節(jié)的兩倍,并且?guī)缀醣?FONT size=+0>Python 3.1的性能地了二十倍。 Python 2.5、2.6和3.1所用的時(shí)間大體相當(dāng)。
從Python 2.x升級(jí)到Python 3.0的時(shí)候,Unicode的處理有了明顯的改善。以下程序?qū)σ粋€(gè)存放在緩沖區(qū)的1,000,000個(gè)希伯來語單詞“shalom”在UTF-8和UTF-16之間來回進(jìn)行編碼和解碼處理。此緩沖區(qū)總大小為五百萬字節(jié)。
- 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版本下運(yùn)行此程序的時(shí)候,兩種的速度大體相當(dāng);然而,Python 3.0卻要快得多(大約快了5-6倍),而Python 3.1則要比Python 2.x快了近八倍,比Python 3.0快40%左右。
【編輯推薦】