當前位置:首頁 » 編程語言 » pythonlistin效率

pythonlistin效率

發布時間: 2024-04-18 22:59:42

A. 如何提高python的運行效率

竅門一:關鍵代碼使用外部功能包

Python簡化了許多編程任務,但是對於一些時間敏感的任務,它的表現經常不盡人意。使用C/C++或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的運行效率。這些功能包往往依附於特定的平台,因此你要根據自己所用的平台選擇合適的功能包。簡而言之,這個竅門要你犧牲應用的可移植性以換取只有通過對底層主機的直接編程才能獲得的運行效率。以下是一些你可以選擇用來提升效率的功能包:

Cython
Pylnlne
PyPy
Pyrex

這些功能包的用處各有不同。比如說,使用c語言的數據類型,可以使涉及內存操作的任務更高效或者更直觀。Pyrex就能幫助Python延展出這樣的功能。Pylnline能使你在Python應用中直接使用C代碼。內聯代碼是獨立編譯的,但是它把所有編譯文件都保存在某處,並能充分利用C語言提供的高效率。

竅門二:在排序時使用鍵

Python含有許多古老的排序規則,這些規則在你創建定製的排序方法時會佔用很多時間,而這些排序方法運行時也會拖延程序實際的運行速度。最佳的排序方法其實是盡可能多地使用鍵和內置的sort()方法。譬如,拿下面的代碼來說:

import operator
somelist = [(1, 5,]
在每段例子里,list都是根據你選擇的用作關鍵參數的索引進行排序的。這個方法不僅對數值類型有效,還同樣適用於字元串類型。

竅門三:針對循環的優化

每一種編程語言都強調最優化的循環方案。當使用Python時,你可以藉助豐富的技巧讓循環程序跑得更快。然而,開發者們經常遺忘的一個技巧是:盡量避免在循環中訪問變數的屬性。譬如,拿下面的代碼來說:

lowerlist = ['this', 'is', 'lowercase']
upper = str.upper
upperlist = []
append = upperlist.append
for word in lowerlist:
append(upper(word))
print(upperlist)
#Output = ['THIS', 'IS', 'LOWERCASE']
每次你調用str.upper, Python都會計算這個式子的值。然而,如果你把這個求值賦值給一個變數,那麼求值的結果就能提前知道,Python程序就能運行得更快。因此,關鍵就是盡可能減小Python在循環中的工作量。因為Python解釋執行的特性,在上面的例子中會大大減慢它的速度。

(注意:優化循環的方法還有很多,這只是其中之一。比如,很多程序員會認為,列表推導式是提高循環速度的最佳方法。關鍵在於,優化循環方案是提高應用程序運行速度的上佳選擇。)

竅門四:使用較新的Python版本

如果你在網上搜索Python,你會發現數不盡的信息都是關於如何升級Python版本。通常,每個版本的Python都會包含優化內容,使其運行速度優於之前的版本。但是,限制因素在於,你最喜歡的函數庫有沒有同步更新支持新的Python版本。與其爭論函數庫是否應該更新,關鍵在於新的Python版本是否足夠高效來支持這一更新。

你要保證自己的代碼在新版本里還能運行。你需要使用新的函數庫才能體驗新的Python版本,然後你需要在做出關鍵性的改動時檢查自己的應用。只有當你完成必要的修正之後,你才能體會新版本的不同。

然而,如果你只是確保自己的應用在新版本中可以運行,你很可能會錯過新版本提供的新特性。一旦你決定更新,請分析你的應用在新版本下的表現,並檢查可能出問題的部分,然後優先針對這些部分應用新版本的特性。只有這樣,用戶才能在更新之初就覺察到應用性能的改觀。

竅門五:嘗試多種編碼方法

每次創建應用時都使用同一種編碼方法幾乎無一例外會導致應用的運行效率不盡人意。可以在程序分析時嘗試一些試驗性的辦法。譬如說,在處理字典中的數據項時,你既可以使用安全的方法,先確保數據項已經存在再進行更新,也可以直接對數據項進行更新,把不存在的數據項作為特例分開處理。請看下面第一段代碼:

n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
if char not in myDict:
myDict[char] = 0
myDict[char] += 1
print(myDict)
當一開始myDict為空時,這段代碼會跑得比較快。然而,通常情況下,myDict填滿了數據,至少填有大部分數據,這時換另一種方法會更有效率。

n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
try:
myDict[char] += 1
except KeyError:
myDict[char] = 1
print(myDict)
在兩種方法中輸出結果都是一樣的。區別在於輸出是如何獲得的。跳出常規的思維模式,創建新的編程技巧能使你的應用更有效率。

竅門六:交叉編譯你的應用

開發者有時會忘記計算機其實並不理解用來創建現代應用程序的編程語言。計算機理解的是機器語言。為了運行你的應用,你藉助一個應用將你所編的人類可讀的代碼轉換成機器可讀的代碼。有時,你用一種諸如Python這樣的語言編寫應用,再以C++這樣的語言運行你的應用,這在運行的角度來說,是可行的。關鍵在於,你想你的應用完成什麼事情,而你的主機系統能提供什麼樣的資源。

Nuitka是一款有趣的交叉編譯器,能將你的Python代碼轉化成C++代碼。這樣,你就可以在native模式下執行自己的應用,而無需依賴於解釋器程序。你會發現自己的應用運行效率有了較大的提高,但是這會因平台和任務的差異而有所不同。

(注意:Nuitka現在還處在測試階段,所以在實際應用中請多加註意。實際上,當下最好還是把它用於實驗。此外,關於交叉編譯是否為提高運行效率的最佳方法還存在討論的空間。開發者已經使用交叉編譯多年,用來提高應用的速度。記住,每一種解決辦法都有利有弊,在把它用於生產環境之前請仔細權衡。)

在使用交叉編譯器時,記得確保它支持你所用的Python版本。Nuitka支持Python2.6, 2.7, 3.2和3.3。為了讓解決方案生效,你需要一個Python解釋器和一個C++編譯器。Nuitka支持許多C++編譯器,其中包括Microsoft Visual Studio,MinGW 和 Clang/LLVM。

交叉編譯可能造成一些嚴重問題。比如,在使用Nuitka時,你會發現即便是一個小程序也會消耗巨大的驅動空間。因為Nuitka藉助一系列的動態鏈接庫(DDLs)來執行Python的功能。因此,如果你用的是一個資源很有限的系統,這種方法或許不太可行。

B. python怎麼用insert函數插入多個值

a=[1,2,3,9,10]
b=[4,5,6,7,8]
c=a[:3]+b+a[3:]
print(c)
#[1,2,3,4,5,6,7,8,9,10]


#Solution2:uselist.insert(index,element)
a=[1,2,3,9,10]
b=[4,5,6,7,8]
index=3
foriinb[::-1]:
a.insert(index,i)
print(a)
#[1,2,3,4,5,6,7,8,9,10]

C. Python怎麼設置條件表達式會提高效率

1.把range全部換成xrange
2.生成器,如 list=(item for item in fp)
3.利用psyco庫,提高函數和類的運行效率。
4.字元串拼接:盡量少用「+」的方式,而採用''.join ,還有"%s"%i這樣賦值的手段
5.函數的開銷很大。盡量把循環放在函數內進行。而不要讓每次迭代都調用函數。
6.「前提工作」先做好,比如該賦值,該拼接的,然後再引入到函數中,或者進行下面的循環。
7.盡量使用內置方法,因為內置的是C寫的,效率肯定高很多
8.每當要對序列中的內容進行循環處理時,就應當嘗試用列表解析來代替它,如:[i for i in xrang(10) if i%2==0]
9.學會使用itertools模塊。當python中添加了迭代器後,就為常見模式提供了一個新的模塊,因為它是以C語言編寫,所以提供了最高效的迭代器。
--多記錄一些。列表,字元串,字典,xrange,類文件對象,這些都是可迭代對象,換句話說,都可以直接用在for循環中進行迭代,如for item in open('1.txt')
--直接使用速度會快。另外,我對比了itertools里工具和xrange,比如都循環100000次列印數字,使用islice(count(),100000)均要比xrange(100000)快
--而xrange還要比range快。
10.用列表解析取代for循環。列表解析的效率等於或高於map。
11.垃圾回收機制,會對列表的操作有重大影響,如列表的append,或者列表解析。import gc,然後在數據載入模塊前gc.disable(),結束後再gc.enable()。

D. python和c語言的區別是什麼

Python可以說是目前最火的語言之一了,人工智慧的興起讓Python一夜之間變得家喻戶曉,Python號稱目前最最簡單易學的語言,現在有不少高校開始將Python作為大一新生的入門語言。本萌新也剛開始接觸Python,發現Python與其他語言確實有很大的區別。Python是由C語言實現的,因此想把Python與C語言做一個簡單的比較。

1、語言類型

Python是一種基於解釋器的語言,解釋器會逐行讀取代碼;首先將Python編譯為位元組碼,然後由大型C程序解釋。

C是一種編譯語言,完整的源代碼將直接編譯為機器代碼,由CPU直接執行。

2、內存管理

Python使用自動垃圾收集器進行內存管理。

在C語言中,程序員必須自己進行內存管理。

3、應用

Python是一種通用編程語言,一個多範式。它主要支持面向對象編程,程序編程,函數編程。

C是結構化編程語言。允許使用函數,選擇(if / else等),迭代(循環)。它主要用於硬體相關的應用程序。

4、速度

Python編程語言因為歷史原因,有一個GIL鎖,導致其對多線程支持不夠好,運行速度較慢;而C語言很快,C語言是比較底層的語言,運行效率上要優於Python。

5、復雜度不一樣

在Python中,不需要聲明變數類型。而在C中,必須聲明變數類型。

Python程序更易於學習,編寫和閱讀。而C程序語法比Python更難。

Python中的測試和調試更容易;而在C中測試和調試更難。

相關推薦:《Python教程》

知識點擴展

大的區別。Python是由C語言實現的,因此想把Python與C語言做一個簡單的比較。

一、C語言是編譯型語言,經過編譯後,生成機器碼,然後再運行,執行速度快,不能跨平台,一般用於操作系統,驅動等底層開發。

Python是編譯型還是解釋型這個界限並不明顯,但大致上可以理解為解釋型語言,執行速度慢,由於Python虛擬機,Python是可以跨平台的,Python高度集成適合於軟體的快速開發。

二、

C語言中需要事先定義變數類型,以int類型為例,當定義一個int型變數後,就會在內存中開辟4個位元組,再來進行初始化,由於長度是指定的,在運算過程中需要考慮,溢出,精度等問題。

Python中的數據類型:

1.Number:數字

·Int

·Float

·Bool

·Complex

2.String:字元串

3.List:列表

4.Tupel:元組

5.Sets:集合

6.Dictionary:字典

Python不需要事先定義變數類型,以a=3為例,在內存中存放一個整數3,然後再用變數a指向3,變數a是沒有類型的,我們所說的類型是指變數所指的內存中對象的類型。

從數據類型上就可以看出Python的友好性,基本數據類型變少了,沒有煩人的指針,不需要考慮數據溢出和精度的問題,當在程序中需要使用某個變數時,就能夠直接使用,而不需要在程序開頭定義變數。除此之外,Python還提供了str,list,dict這些強大的數據類型,讓程序開發變的更為簡單。

三、Python還提供了一個交互界面,輸入python進入交互界面,輸入exit()退出交互界面,類似於Linux終端,輸入一行命令,執行一行,為學習Python提供了很大的便利。

四、在運算符和優先順序上面,兩者並沒有大的區別,但在python中沒有自加和自減運算符,在邏輯運算符上Python也區別於C語言,Python中是and,or,not ,而C語言中則是&&,||,!

五、Python中通過縮進來表示語句體,C語言通過{}來表示語句體,並且在Python中每一條語句結尾後沒有分號,判斷語句if else,這兩者沒有區別,循環語句while也沒有,只是for循環,Python通過for in來表示。

六、Python有很多內置函數(build in function),不需要寫頭文件,Python還有很多強大的模塊,需要時導入便可。C語言在這一點上遠不及Python,大多時候都需要自己手動實現。

七、C語言中的函數,有著嚴格的順序限制,如果要調用函數,該函數需要在本次調用之前就需要被實現,或者在程序開頭事先聲明,而Python中則沒有這個限制,Python中還有高階函數這一概念,即函數名也可當作函數參數,函數名也是一種變數,指向內存中的某個函數,這種寫法可以大大減少代碼長度。

python中還提供了可變參數和關鍵字參數,這樣使得函數的功能大大提高,原來需要寫多個函數,現在只需要一個函數就可以實現這些功能。

八、C語言是面向過程的語言,很多時候都需要自己手動實現函數來完成某一功能。Python中引入了類和對象,是面向對象編程的語言,面向對象使得代碼的可重用性大大提高,數據的封裝性也更好。面向對象與面向過程的具體比較就不多說了,但有兩句非常重要的話:類是抽象的,而對象是具體的。

九、python中既有函數也有方法,常常讓人疑惑,我個人覺得也沒有必要區分的非常清楚,但是兩者還是有較大的區別:函數是自由的,而方法是受限的。在編程的時候需要分清楚調用的是方法還是函數。

總結:Python可以說是非常「簡單」的語言,高度集成,代碼量少,簡單是相對其他語言而言。但編程從來都不是一個簡單活,需要我們不斷學習,掌握底層實現原理,才是正道。

E. python 把列表當作隊列使用方法

可以把列表當做隊列用,只是在隊列里第一加入的元素,第一個取出來;但是拿列表用作這樣的目的效率不高。在列表的最後添加或者彈出元素速度快,然而在列表裡插入或者從頭部彈出速度卻不快(因為所有其他的元素都得一個一個地移動)。

F. 如何在Python中編寫並發程序

GIL

在Python中,由於歷史原因(GIL),使得Python中多線程的效果非常不理想.GIL使得任何時刻Python只能利用一個CPU核,並
且它的調度演算法簡單粗暴:多線程中,讓每個線程運行一段時間t,然後強行掛起該線程,繼而去運行其他線程,如此周而復始,直到所有線程結束.

這使得無法有效利用計算機系統中的"局部性",頻繁的線程切換也對緩存不是很友好,造成資源的浪費.

據說Python官方曾經實現了一個去除GIL的Python解釋器,但是其效果還不如有GIL的解釋器,遂放棄.後來Python官方推出了"利
用多進程替代多線程"的方案,在Python3中也有concurrent.futures這樣的包,讓我們的程序編寫可以做到"簡單和性能兼得".

多進程/多線程+Queue

一般來說,在Python中編寫並發程序的經驗是:計算密集型任務使用多進程,IO密集型任務使用多進程或者多線程.另外,因為涉及到資源共享,所
以需要同步鎖等一系列麻煩的步驟,代碼編寫不直觀.另外一種好的思路是利用多進程/多線程+Queue的方法,可以避免加鎖這樣麻煩低效的方式.

現在在Python2中利用Queue+多進程的方法來處理一個IO密集型任務.

假設現在需要下載多個網頁內容並進行解析,單進程的方式效率很低,所以使用多進程/多線程勢在必行.
我們可以先初始化一個tasks隊列,裡面將要存儲的是一系列dest_url,同時開啟4個進程向tasks中取任務然後執行,處理結果存儲在一個results隊列中,最後對results中的結果進行解析.最後關閉兩個隊列.

下面是一些主要的邏輯代碼.

# -*- coding:utf-8 -*-

#IO密集型任務
#多個進程同時下載多個網頁
#利用Queue+多進程
#由於是IO密集型,所以同樣可以利用threading模塊

import multiprocessing

def main():
tasks = multiprocessing.JoinableQueue()
results = multiprocessing.Queue()
cpu_count = multiprocessing.cpu_count() #進程數目==CPU核數目

create_process(tasks, results, cpu_count) #主進程馬上創建一系列進程,但是由於阻塞隊列tasks開始為空,副進程全部被阻塞
add_tasks(tasks) #開始往tasks中添加任務
parse(tasks, results) #最後主進程等待其他線程處理完成結果

def create_process(tasks, results, cpu_count):
for _ in range(cpu_count):
p = multiprocessing.Process(target=_worker, args=(tasks, results)) #根據_worker創建對應的進程
p.daemon = True #讓所有進程可以隨主進程結束而結束
p.start() #啟動

def _worker(tasks, results):
while True: #因為前面所有線程都設置了daemon=True,故不會無限循環
try:
task = tasks.get() #如果tasks中沒有任務,則阻塞
result = _download(task)
results.put(result) #some exceptions do not handled
finally:
tasks.task_done()

def add_tasks(tasks):
for url in get_urls(): #get_urls() return a urls_list
tasks.put(url)

def parse(tasks, results):
try:
tasks.join()
except KeyboardInterrupt as err:
print "Tasks has been stopped!"
print err

while not results.empty():
_parse(results)

if __name__ == '__main__':
main()

利用Python3中的concurrent.futures包

在Python3中可以利用concurrent.futures包,編寫更加簡單易用的多線程/多進程代碼.其使用感覺和Java的concurrent框架很相似(借鑒?)
比如下面的簡單代碼示例

def handler():
futures = set()

with concurrent.futures.ProcessPoolExecutor(max_workers=cpu_count) as executor:
for task in get_task(tasks):
future = executor.submit(task)
futures.add(future)

def wait_for(futures):
try:
for future in concurrent.futures.as_completed(futures):
err = futures.exception()
if not err:
result = future.result()
else:
raise err
except KeyboardInterrupt as e:
for future in futures:
future.cancel()
print "Task has been canceled!"
print e
return result

總結

要是一些大型Python項目也這般編寫,那麼效率也太低了.在Python中有許多已有的框架使用,使用它們起來更加高效.

G. python語言運行速度如此差

這就要說到 Python 類語言和 C 類語言的主要區別了,Python 屬於解釋型語言,通俗來說就是你可以一句一句地輸入,而 Python 解釋器(Interpreter)可以一句一句地執行,而 C 語言屬於編譯型語言,無法做到這一點,只能一次性輸入完成,編譯成一個完整的程序再執行,而這個編譯的過程由於現代編譯器做了非常多的優化,並且你的程序沒有輸入只有輸出,每次運行都出固定的結果,所以極有可能被編譯器優化成為了只有一條輸出語句(實際情況可能要復雜一些),總的來說就是由於二者之間原理的差異導致了性能的差異,你可以搜一搜相關的資料,關掉 C 語言編譯時的優化,再看一下性能,或者將固定的那些值改為運行時需要輸入再看一下效果。
Python 相較於 C 的優勢有很多,性能這一方面你不需要關心,做出一個足夠復雜的程序,它們之間運行效率差不了多少的。

H. python 字典和元組遍歷速度哪個快

當然是元組了,元組就相當於數組,直接按照索引去取元素。而字典是按照key去取元素(類似於hash表),速度當然比不上元組了。下面的測試可以提供一些直觀的感覺。


$python-mtimeit-s'a=dict(a=12,b=13,c=14)''fork,vina.items():''pass'
1000000loops,bestof3:0.391usecperloop
$python-mtimeit-s'a=(12,13,14)''forvina:''pass'
10000000loops,bestof3:0.12usecperloop


可以看到遍歷同樣是三個元素的dict的時間大致上是tuple的3倍左右。 (實際上這個時間包括了創建 dict 和 tuple 的時間,創建dict的時間也是要大於創建tuple的時間的,這里就不細分了,總之,dict的創建、訪問時間一定是大於tuple的)


但是在python中,dict是做過極度優化的,其效率已經非常高了,因為在python中它的使用實在是太廣了。所以在實際編程中,一般我們只根據實際需求來考慮使用什麼數據結構 (dict, list, set, tuple),而不是根據不同數據結構的訪問速度差別。

熱點內容
淘寶帳號怎麼改密碼 發布:2024-11-28 07:46:05 瀏覽:11
監控未配置怎麼辦視頻 發布:2024-11-28 07:44:41 瀏覽:501
android獲取手機的ip 發布:2024-11-28 07:42:13 瀏覽:170
python打開文件窗口 發布:2024-11-28 07:36:13 瀏覽:555
cpu二級緩存的作用 發布:2024-11-28 07:36:12 瀏覽:1001
net資料庫控制項 發布:2024-11-28 07:32:58 瀏覽:99
我的世界國際服創建伺服器pc 發布:2024-11-28 07:20:53 瀏覽:773
編譯原理LR分析法pdf 發布:2024-11-28 07:17:41 瀏覽:264
安卓光遇版本怎麼看 發布:2024-11-28 06:29:52 瀏覽:871
oraclesql加密 發布:2024-11-28 06:29:15 瀏覽:901