導航:首頁 > 編程語言 > python運算效率

python運算效率

發布時間:2023-07-14 10:18:08

python處理Excel效率高十倍(下篇)通篇硬幹貨,再也不用加班啦

《用Python處理Excel表格》下篇來啦!

身為工作黨或學生黨的你,平日里肯定少不了與Excel表格打交道的機會。當你用Excel處理較多數據時,還在使用最原始的人工操作嗎?現在教你如何用Python處理Excel,從此處理表格再也不加班,時間縮短數十倍!

上篇我們進行了一些事前准備,目的是用Python提取Excel表中的數據。而這一篇便是在獲取數據的基礎上,對Excel表格的實操處理。

第9行代碼用來指定創建的excel的活動表的名字:
·不寫第9行,默認創建sheet
·寫了第9行,創建指定名字的sheet表

第9行代碼,通過給單元格重新賦值,來修改單元格的值
第9行代碼的另一種寫法sheet['B1'].value = 'age'
第10行代碼,保存時如果使用原來的(第7行)名字,就直接保存;如果使用了別的名字,就會另存為一個新文件

插入有效數據
使用append()方法,在原來數據的後面,按行插入數據

·insert_rows(idx=數字編號, amount=要插入的行數),插入的行數是在idx行數的下方插入
·insert_cols(idx=數字編號, amount=要插入的列數),插入的位置是在idx列數的左側插入

·delete_rows(idx=數字編號, amount=要刪除的行數)
·delete_cols(idx=數字編號, amount=要刪除的列數)

move_range(「數據區域」,rows=,cols=):正整數為向下或向右、負整數為向左或向上

舉個例子:

openpyxl.styles.Font(name=字體名稱,size=字體大小,bold=是否加粗,italic=是否斜體,color=字體顏色)
其中,字體顏色中的color是RGB的16進製表示

再者,可以使用for循環,修改多行多列的數據,在這里介紹了獲取的方法

Alignment(horizontal=水平對齊模式,vertical=垂直對齊模式,text_rotation=旋轉角度,wrap_text=是否自動換行)
水平對齊:『distributed』,『justify』,『center』,『left』, 『centerContinuous』,'right,『general』
垂直對齊:『bottom』,『distributed』,『justify』,『center』,『top』

當然,你仍舊可以調用for循環來實現對多行多列的操作

設置行列的寬高:
·row_dimensions[行編號].height = 行高
·column_dimensions[列編號].width = 列寬

合並單元格有下面兩種方法,需要注意的是,如果要合並的格子中有數據,即便python沒有報錯,Excel打開的時候也會報錯。
merge_cells(待合並的格子編號)
merge_cells(start_row=起始行號,start_column=起始列號,end_row=結束行號,end_column=結束列號)

拆分單元格的方法同上
unmerge_cells(待合並的格子編號)
unmerge_cells(start_row=起始行號,start_column=起始列號,end_row=結束行號,end_column=結束列號)

create_sheet(「新的sheet名」):創建一個新的sheet表

第11行,使用title修改sheet表的名字

remove(「sheet名」):刪除某個sheet表
要刪除某sheet表,需要激活這個sheet表,即:將其作為活動表(關於活動表的定義請看前面文章開頭寫的有)下面8~11行代碼展示了原始活動表與手動更換活動表,第13行代碼刪掉活動表

背景知識
numpy與pandas
NumPy是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫;pandas 是基於NumPy 的一種工具,該工具是為解決數據分析任務而創建的,我們需要利用Pandas進行Excel的合並

1.下面的代碼生成了一個5行3列的包含15個字元的嵌套列表
(注意,第4行代碼:15是等於35的,如果是15對應43,或者16對應5*3都會報錯)
(注意,第5行代碼,雖然5行3列是15個數據,但是可以指定數據從1開頭,到16結束)

2.添加表頭
使用pandas庫的DataFrame來添加表頭。關於列印的結果,把最左側的一列去掉之後會發現結果很和諧,這是因為最左側的一列代錶行號。此時xx變數的類型是

xlsxwriter模塊一般是和xlrd模塊搭配使用的,
xlsxwriter:負責寫入數據,
xlrd:負責讀取數據。

1.創建一個工作簿

2.創建sheet表

3.寫入數據

㈡ 如何提高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的功能。因此,如果你用的是一個資源很有限的系統,這種方法或許不太可行。

㈢ python為啥運行效率不高

原因:1、python是動態語言;2、python是解釋執行,但是不支持JIT;3、python中一切都是對象,每個對象都需要維護引用計數,增加了額外的工作。4、python GIL;5、垃圾回收。

當我們提到一門編程語言的效率時:通常有兩層意思,第一是開發效率,這是對程序員而言,完成編碼所需要的時間;另一個是運行效率,這是對計算機而言,完成計算任務所需要的時間。編碼效率和運行效率往往是魚與熊掌的關系,是很難同時兼顧的。不同的語言會有不同的側重,python語言毫無疑問更在乎編碼效率,life is short,we use python。

雖然使用python的編程人員都應該接受其運行效率低的事實,但python在越多越來的領域都有廣泛應用,比如科學計算 、web伺服器等。程序員當然也希望python能夠運算得更快,希望python可以更強大。

首先,python相比其他語言具體有多慢,這個不同場景和測試用例,結果肯定是不一樣的。這個網址給出了不同語言在各種case下的性能對比,這一頁是python3和C++的對比,下面是兩個case:

從上圖可以看出,不同的case,python比C++慢了幾倍到幾十倍。

python運算效率低,具體是什麼原因呢,下列羅列一些:

第一:python是動態語言

一個變數所指向對象的類型在運行時才確定,編譯器做不了任何預測,也就無從優化。舉一個簡單的例子:r = a + b。a和b相加,但a和b的類型在運行時才知道,對於加法操作,不同的類型有不同的處理,所以每次運行的時候都會去判斷a和b的類型,然後執行對應的操作。而在靜態語言如C++中,編譯的時候就確定了運行時的代碼。

另外一個例子是屬性查找,關於具體的查找順序在《python屬性查找》中有詳細介紹。簡而言之,訪問對象的某個屬性是一個非常復雜的過程,而且通過同一個變數訪問到的python對象還都可能不一樣(參見Lazy property的例子)。而在C語言中,訪問屬性用對象的地址加上屬性的偏移就可以了。

第二:python是解釋執行,但是不支持JIT(just in time compiler)。雖然大名鼎鼎的google曾經嘗試Unladen Swallow 這個項目,但最終也折了。

第三:python中一切都是對象,每個對象都需要維護引用計數,增加了額外的工作。

第四:python GIL,GIL是Python最為詬病的一點,因為GIL,python中的多線程並不能真正的並發。如果是在IO bound的業務場景,這個問題並不大,但是在CPU BOUND的場景,這就很致命了。所以筆者在工作中使用python多線程的情況並不多,一般都是使用多進程(pre fork),或者在加上協程。即使在單線程,GIL也會帶來很大的性能影響,因為python每執行100個opcode(默認,可以通過sys.setcheckinterval()設置)就會嘗試線程的切換,具體的源代碼在ceval.c::PyEval_EvalFrameEx。

第五:垃圾回收,這個可能是所有具有垃圾回收的編程語言的通病。python採用標記和分代的垃圾回收策略,每次垃圾回收的時候都會中斷正在執行的程序,造成所謂的頓卡。infoq上有一篇文章,提到禁用Python的GC機制後,Instagram性能提升了10%。感興趣的讀者可以去細讀。

推薦課程:Python機器學習(Mooc禮欣、嵩天教授)

㈣ 如何提高python的運行效率

使用「if value in b」來替換第二個for循環能夠提高一點效率,但是對於樓主的這個問題,優化地還很不夠。對於樓主這類檢查一個元素是否在某個集合之中,當數據量很大的時候,最符合需求的優化應該是「使用set類型來替換list類型」。
因為set在內部是使用哈希表來實現的,而list僅僅相當於C中的普通數組,因此查詢效率對於set來說,大部分情況下能達到O(1),而list是O(n),這個當數據量很大的時候差別就極其明顯了。
優化的效果十分顯著,我深有體會。有次我寫一個有點復雜的查詢,數據量大概在幾百萬級別,跑完整個代碼大概花了20min,然後我在網上找到了這種優化方式之後,對我的主for循環就進行了這么一點小修改,執行時間立馬縮短到了2s,速度提高了600多倍!

順便給樓主一個建議,這種寫法依然是在用傳統C的思維在寫Python代碼,用個詞來形容叫不夠Pythonic,也就是不夠簡潔,不能表現出Python的特色。很多Python專用的寫法是明顯提高代碼效率的,比如另外一位給出的建議使用「if value in b」這個語句來替換第二個for循環。

㈤ 為什麼python內置的sort比自己寫的快速排序快100倍

主要原因,內置函數用C寫的。在Python語言內無論如何造不出內置函數的輪子。這也是通常C跟C++語言用戶更喜歡造基礎演算法的輪了的原因。因為C/C++用戶真有條件寫出匹敵標准庫的演算法,但很多高級語言不行,不是程序員技術差,是客觀條件就根本做不到。

你比如說Java語言沒人造字元串的輪子,C++光一個字元串類就有無數多的實現。是因為C+用戶更喜歡寫字元串類嗎?顯然不是,一方面是因為Java語言內沒法造出匹敵Java內置標准庫演算法的輪子,而C++真的可以,另外一個比較慘的原因是C++標准庫的字元串功能太弱了,大多數高級語言的字元串類功能都比C+標准庫字元串類功能更強。

Cpp內置的排序是快排和堆排的結合,最壞時間復雜度為nlogn,而快排最壞是n2。至於python內部的排序,我認為是一個道理,不會簡簡單單是一個快排,舉個簡單例子,當你數據已經是有序的時候,再傳入快排肯定就不合適。那你設置排序函數的時候,是不是預先將他打亂,再進行快排會更好呢。當然具體不會這么簡單,只是我認為官方給的介面都是很精妙的,很值得學習。

一方面Python中sort函數是用C語言寫的,C++內部的sort是由快排,直接插入和堆排序混合的,當數據量比較大的時候先用的快排,當數據量小的時候用直接插入,因為當數據量變小時,快排中的每個部分基本有序,接近直接插入的最好情況的時間復雜度O(n),就比快排要好一點了。

另外一方面這個的底層實現就是歸並排序。,只是使用了Python無法編寫的底層實現,從而避免了Python本身附加的大量開銷,速度比我們自己寫的歸並排序要快很多,所以說我們一般排序都盡量使用sorted和sort。

閱讀全文

與python運算效率相關的資料

熱點內容
頭條app如何設置橫屏模式 瀏覽:355
clion怎麼使用終端編譯 瀏覽:766
伺服器地址部署到公網 瀏覽:492
新桑塔納安卓大屏導航怎麼拆 瀏覽:382
程序員送給女友的禮物 瀏覽:430
ftp命令行查看文件數量 瀏覽:496
linux查看設備的命令 瀏覽:827
pythongolang學哪個 瀏覽:349
金蝶加密鎖驅動下載 瀏覽:300
python編程基於自然語言處理庫 瀏覽:133
javaseruntime 瀏覽:902
cad如何將命令放在滑鼠旁邊 瀏覽:746
程序員對粉色 瀏覽:125
編譯器命令java 瀏覽:989
雲伺服器怎麼數據同步 瀏覽:685
c盤文件修復命令語 瀏覽:966
文件夾中文件怎麼上下移動 瀏覽:831
魅族手機用什麼軟體解壓 瀏覽:763
加密幣糖果 瀏覽:300
c編譯調試是什麼 瀏覽:631