日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
時間管理很重要:Python代碼的優(yōu)化之道

時間管理可是一門大學(xué)問,如何在有限的時間更快地運(yùn)行代碼,并且擁有更優(yōu)秀的性能,是我們應(yīng)該去思考的事情。畢竟,成為偉大程序員之路就是要不斷超越自己,尋找最優(yōu)解。本文就將給大家提供一些時間管理的小tips。

富源ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

1. 優(yōu)化代碼和算法

首先,要仔細(xì)閱讀你的代碼和算法。通過執(zhí)行更優(yōu)算法或添加緩存可以解決很多速度問題。具體的準(zhǔn)則能寫整本書,但要遵循的一些通用準(zhǔn)則是:

  • 測試,不要猜測。測試代碼哪些部分的運(yùn)行耗費(fèi)最長時間,首先關(guān)注這些部分。
  • 減少內(nèi)存使用量。通常情況下,請嘗試減少內(nèi)存使用量。例如:逐行分析一個大型文件,而不先將其存儲到內(nèi)存中。
  • 執(zhí)行緩存。如果你從磁盤,網(wǎng)絡(luò)和數(shù)據(jù)庫中執(zhí)行許多重復(fù)的搜索,那么執(zhí)行緩存可能是一個很大的優(yōu)化。
  • 盡可能減少代碼中的迭代次數(shù),尤其減少迭代內(nèi)部操作的次數(shù)。
  • 避免(深度)遞歸。對Python解釋器而言,這需要大量內(nèi)存和內(nèi)務(wù)處理,改用生成器和迭代等。
  • 重用對象,而不是在每次迭代中創(chuàng)建新對象。Python必須清理已經(jīng)創(chuàng)建的每個對象才能釋放內(nèi)存。這被稱作垃圾回收。許多未使用對象的垃圾回收過程會大大降低軟件速度。
  • 不要這樣做。你真的需要執(zhí)行該操作嗎?它可以被放在之后完成嗎?或是該操作可被一次完成,并可以存儲其結(jié)果而不進(jìn)行一遍又一遍地計算?

2. 使用PyPy

你可能正在使用Python的參考實(shí)現(xiàn)——CPython,它之所以被稱作CPython,是因?yàn)樗蒀語言編寫而成。很多人都在用它。

但如果確定自己的代碼為計算密集型,PyPy會是一個更好的選擇。它有可能是一種快速解決方案,且無需更改單行代碼。

PyPy聲稱:它比CPython平均快4.4倍。它通過使用一種叫作即時編譯(JIT)的技術(shù)加快代碼執(zhí)行速度,其他的JIT還包括Java和.NET框架。而CPython使用解釋器執(zhí)行代碼,盡管這提供了很大程度的靈活性,速度卻非常慢。

使用JIT,可以在運(yùn)行程序的同時編譯代碼。它結(jié)合了提前編譯(由C和C ++等語言使用)的速度優(yōu)勢和解釋器的靈活性。此外,JIT編譯器還可以在代碼運(yùn)行時繼續(xù)將其優(yōu)化。代碼運(yùn)行時間越長,就越優(yōu)化。

PyPy在近幾年里發(fā)展很快,通??梢员挥米鱌ython 2和3的直接替代。它也可以與Pipenv等工具完美配合使用。

3. 使用Asyncio

Asyncio是Python中一個相對較新的核心庫。它與線程解決了相同的問題:即加速了I/O密集型軟件系統(tǒng),但Asyncio實(shí)現(xiàn)方式不同。

筆者其實(shí)并不喜歡在Python中使用asyncio。Asyncio相當(dāng)復(fù)雜,特別是對于初學(xué)者。而且由于asyncio庫在過去的幾年中發(fā)展了很多,網(wǎng)絡(luò)上的教程和示例代碼通常已經(jīng)過時。

但這并不意味著它沒有用。這是一種強(qiáng)大的范例,可用于許多高性能應(yīng)用程序。

4. 使用多線程

多數(shù)軟件系統(tǒng)為I/O密集型,而非計算密集型:

  • I/O密集型 —軟件系統(tǒng)通常在等待輸入/輸出操作完成。從網(wǎng)絡(luò)或慢速存儲器中獲取數(shù)據(jù)時通常是這種情況。
  • 計算密集型 —軟件系統(tǒng)使CPU(中央處理器)達(dá)到極限。它使用CPU的所有功能來生成所需的結(jié)果。

在從網(wǎng)絡(luò)或磁盤中等待回答時,可以使用多個線程維持其他部分的運(yùn)行。

線程是獨(dú)立的執(zhí)行序列。默認(rèn)情況下,Python程序具有一個主線程。但可以創(chuàng)建更多線程,并讓Python在不同線程之間轉(zhuǎn)換。這種轉(zhuǎn)換發(fā)生非常快,顯得似乎在同時并排運(yùn)行。

線程是獨(dú)立的執(zhí)行序列,共享相同的存儲

不同于其他語言,Python多線程不能同時運(yùn)行,而是輪流運(yùn)行,這主要是因?yàn)樗娜纸忉屍麈i(GIL)的機(jī)制。

可見,多線程將對I / O密集型軟件系統(tǒng)產(chǎn)生巨大影響,但對計算密集型軟件系統(tǒng)而言用途甚微。

為何會這樣?很簡單。當(dāng)一個線程等待來自網(wǎng)絡(luò)的回答時,其他線程能夠繼續(xù)運(yùn)行。如果執(zhí)行大量網(wǎng)絡(luò)請求,使用多線程會大有不同。但如果多線程正在執(zhí)行大量計算,則它們只是等候自己的輪次再繼續(xù)執(zhí)行。線程只會引入更多的開銷。

圖源:fadeevab

5. 同時使用更多處理器

如果軟件系統(tǒng)為計算密集型,則通??梢酝ㄟ^同時使用更多處理器的方式來重寫代碼。這樣,就可以線性擴(kuò)展執(zhí)行速度。

這被稱做并行性。并非所有算法都可以并行運(yùn)行。例如,簡單地并行化遞歸算法是不可能的。但是幾乎總會有一種替代算法可以很好地進(jìn)行并行工作。

有兩種使用更多處理器的方式:

  • 在同一臺計算機(jī)上使用多個處理器和/或內(nèi)核。在Python中,這可以通過使用多處理庫來完成。
  • 用計算機(jī)網(wǎng)絡(luò)來使用分布在多臺機(jī)器上的處理器。我們稱其為分布式計算。

不同于線程庫,多處理庫繞過了Python全局解釋器鎖。它實(shí)際上是通過生成多個Python實(shí)例來實(shí)現(xiàn)的。因此,使用多線程在一個Python進(jìn)程中輪流執(zhí)行,你將擁有多個Python處理器來同時運(yùn)行代碼。

可視化多處理

多處理庫又與線程庫十分相似。那為什么還要考慮線程化?沒錯,線程處理“更輕便”。它只需要一個正在運(yùn)行的Python解釋器,所需的內(nèi)存更少,生成新進(jìn)程也有其開銷。因此,如果代碼為I/O密集型,使用線程可能足夠了。

使軟件系統(tǒng)并行工作后,將分布式計算與諸如Hadoop之類的功能結(jié)合使用僅需一小步。通過利用云計算平臺,目前可以相對輕松地加快運(yùn)行速度。例如,可以在云中處理龐大的數(shù)據(jù)集,并在本地使用結(jié)果。使用混合操作方式,可以節(jié)省一些現(xiàn)金,要知道,云平臺的計算功能可是非常昂貴的。

希望以上這些小技巧能夠幫你擁有更快更強(qiáng)的代碼。


當(dāng)前文章:時間管理很重要:Python代碼的優(yōu)化之道
分享鏈接:http://www.dlmjj.cn/article/djisisi.html