成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python 代碼優(yōu)化技巧(一)

Yumenokanata / 2447人閱讀

摘要:代碼優(yōu)化分享最近看到的關(guān)于代碼優(yōu)化的一些技巧。運(yùn)行結(jié)果合并字符串合并字符串比循環(huán)使用來合并要快。語句的開銷語句有時(shí)候?yàn)榱讼拗扑鼈兊淖饔梅秶蛘吖?jié)省初始化時(shí)間,被卸載函數(shù)內(nèi)部,雖然的解釋器不會(huì)重復(fù)同一個(gè)模塊不會(huì)出錯(cuò),但重復(fù)導(dǎo)入會(huì)影響部分性能。

代碼優(yōu)化Part1

分享最近看到的關(guān)于代碼優(yōu)化的一些技巧。

if 判斷的短路特性

對于and,應(yīng)該把滿足條件少的放在前面,這樣當(dāng)對于大量判斷時(shí), 滿足條件少的情況直接回導(dǎo)致其后其他表達(dá)式不會(huì)計(jì)算從而節(jié)約時(shí)間(因?yàn)?False and True 還是 False)

import timeit

s1 = """
a = range(2000)
[i for i in a if i % 2 ==0 and i > 1900]
"""

s2 = """
a = range(2000)
[i for i in a if  i > 1900 and i % 2 ==0]
"""

print timeit.timeit(stmt=s1, number=1000)
print timeit.timeit(stmt=s2, number=1000)

運(yùn)行結(jié)果如下:

?  python test6.py
0.248532056808
0.195827960968

# 可以看到s2 表達(dá)式計(jì)算更快, 因?yàn)榇蟛糠智闆r都不滿足 i>1900, 所以這些情況下, i % 2 == 0 也沒有計(jì)算,從而節(jié)約了時(shí)間

同理對于or,把滿足條件多的放在前面。

import timeit

s1 = """
a = range(2000)
[i for i in a if 10 < i <20 or 1000 < i < 2000]
"""

s2 = """
a = range(2000)
[i for i in a if 1000 < i < 2000 or 10 < i <20]
"""

print timeit.timeit(stmt=s1, number=1000)
print timeit.timeit(stmt=s2, number=1000)

運(yùn)行結(jié)果:

0.253124952316
0.202992200851
join 合并字符串

join 合并字符串比循環(huán)使用 + 來合并要快。

import timeit

s1 = """
a = [str(x) for x in range(2000)]
s = ""
for i in a:
    s += i
"""

s2 = """
a = [str(x) for x in range(2000)]
s = "".join(a)
"""

print timeit.timeit(stmt=s1, number=1000)
print timeit.timeit(stmt=s2, number=1000)

運(yùn)行結(jié)果如下:

python test6.py

0.558945894241
0.422435998917
while 1 和 while True

在python2.x里, True 和 False 不是保留的關(guān)鍵字,是一個(gè)全局變量,這意味著你可以這樣

>>> True = 0
>>> True
0
>>> if not True:
...   print "1"
...
1

所以下面這兩種情況:

import timeit

s1 = """
n = 1000000
while 1:
    n -= 1
    if n <= 0: break
"""

s2 = """
n = 1000000
while True:
    n -= 1
    if n <= 0: break
"""

print timeit.timeit(stmt=s1, number=100)
print timeit.timeit(stmt=s2, number=100)

運(yùn)行結(jié)果如下:

?  python test6.py
5.18007302284
6.84624099731

因?yàn)槊看闻袛?while True 的時(shí)候, 先要去找到True的值。

在python3.x里, True 變成了關(guān)鍵字參數(shù),所以上述兩種情況就一樣了。

cProfile, cStringIO 和 cPickle

使用C語言的版本寫的擴(kuò)展要比原生的要快。cPickle vs pickle 如下:

import timeit

s1 = """
import cPickle
import pickle
n = range(10000)
cPickle.dumps(n)
"""

s2 = """
import cPickle
import pickle
n = range(10000)
pickle.dumps(n)
"""

print timeit.timeit(stmt=s1, number=100)
print timeit.timeit(stmt=s2, number=100)

運(yùn)行結(jié)果如下:

? python test6.py
0.182178974152
1.70917797089
合理使用生成器 區(qū)別

使用()得到的是一個(gè)generator對象,所需要的內(nèi)存空間與列表的大小無關(guān),所以效率會(huì)高一些。

import timeit

s1 = """
[i for i in range (100000)]
"""

s2 = """
(i for i in range(100000))
"""

print timeit.timeit(stmt=s1, number=1000)
print timeit.timeit(stmt=s2, number=1000)

結(jié)果:

?  python test6.py
5.44327497482
0.923446893692

但是對于需要循環(huán)遍歷的情況:使用迭代器效率反而不高,如下:

import timeit

s1 = """
ls = range(1000000)
def yield_func(ls):
    for i in ls:
        yield i+1
for x in yield_func(ls):
    pass
"""

s2 = """
ls = range(1000000)
def not_yield_func(ls):
    return [i+1 for i in ls]
for x in not_yield_func(ls):
    pass
"""

print timeit.timeit(stmt=s1, number=10)
print timeit.timeit(stmt=s2, number=10)

結(jié)果如下:

?  python test6.py
1.03186702728
1.01472687721

所以使用生成器是一個(gè)權(quán)衡的結(jié)果,對于內(nèi)存、速度綜合考慮的結(jié)果。

xrange

在python2.x里xrange 是純C實(shí)現(xiàn)的生成器,相對于range來說,它不會(huì)一次性計(jì)算出所有值在內(nèi)存中。但它的限制是只能和整型一起工作:你不能使用long或者float。

import 語句的開銷

import語句有時(shí)候?yàn)榱讼拗扑鼈兊淖饔梅秶蛘吖?jié)省初始化時(shí)間,被卸載函數(shù)內(nèi)部,雖然python的解釋器不會(huì)重復(fù)import同一個(gè)模塊不會(huì)出錯(cuò),但重復(fù)導(dǎo)入會(huì)影響部分性能。
有時(shí)候?yàn)榱藢?shí)現(xiàn)懶加載(即使用的時(shí)候再加載一個(gè)開銷很大的模塊),可以這么做:

email = None

def parse_email():
    global email
    if email is None:
        import email
    ...

# 這樣一來email模塊僅會(huì)被引入一次,在parse_email()被第一次調(diào)用的時(shí)候。
參考資源:

https://wiki.python.org/moin/...

http://blog.csdn.net/zhoudaxi...

https://www.ibm.com/developer...

NEXT ctypes

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44282.html

相關(guān)文章

  • 6個(gè)Python性能優(yōu)化技巧

    摘要:的批評者聲稱性能低效執(zhí)行緩慢,但實(shí)際上并非如此嘗試以下個(gè)小技巧,可以加快應(yīng)用程序。使用或者機(jī)器語言擴(kuò)展包來執(zhí)行關(guān)鍵任務(wù)能極大改善性能。但是如果你把求值的結(jié)果放入一個(gè)變量中,就能提高程序的性能。 Python是一門非??岬恼Z言,因?yàn)楹苌俚腜ython代碼可以在短時(shí)間內(nèi)做很多事情,并且,Python很容易就能支持多任務(wù)和多重處理。 Python的批評者聲稱Python性能低效、執(zhí)行緩慢,...

    RobinQu 評論0 收藏0
  • ??導(dǎo)圖整理大廠面試高頻數(shù)組8: 移除元素的雙指針優(yōu)化, 力扣27??

    此專欄文章是對力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...

    zhangyucha0 評論0 收藏0
  • 利用 NGINX 最大化 Python 性能,第二部分:負(fù)載均衡和監(jiān)控

    摘要:現(xiàn)有的服務(wù)器和應(yīng)用程序服務(wù)器相結(jié)合并在一個(gè)冒泡中運(yùn)行,無法直接接觸網(wǎng)絡(luò)流量,由反向代理服務(wù)器提出填鴨式請求。賦予高可用性讓你的反向代理服務(wù)器鏡像到在線備份,同時(shí)擁有備用的應(yīng)用程序服務(wù)器,讓你的站點(diǎn)高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優(yōu)化 Python 應(yīng)用性能。本文系國內(nèi) ITOM 管理平臺 OneAPM 編譯呈現(xiàn)。 本文上一篇系: 利用...

    zhangrxiang 評論0 收藏0
  • 利用 NGINX 最大化 Python 性能,第二部分:負(fù)載均衡和監(jiān)控

    摘要:現(xiàn)有的服務(wù)器和應(yīng)用程序服務(wù)器相結(jié)合并在一個(gè)冒泡中運(yùn)行,無法直接接觸網(wǎng)絡(luò)流量,由反向代理服務(wù)器提出填鴨式請求。賦予高可用性讓你的反向代理服務(wù)器鏡像到在線備份,同時(shí)擁有備用的應(yīng)用程序服務(wù)器,讓你的站點(diǎn)高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優(yōu)化 Python 應(yīng)用性能。本文系國內(nèi) ITOM 管理平臺 OneAPM 編譯呈現(xiàn)。 本文上一篇系: 利用...

    Snailclimb 評論0 收藏0
  • 提高 Python 運(yùn)行效率的六個(gè)竅門

    摘要:使用或機(jī)器語言的外部功能包處理時(shí)間敏感任務(wù),可以有效提高應(yīng)用的運(yùn)行效率。關(guān)鍵在于,優(yōu)化循環(huán)方案是提高應(yīng)用程序運(yùn)行速度的上佳選擇。此外,關(guān)于交叉編譯是否為提高運(yùn)行效率的最佳方法還存在討論的空間。在使用交叉編譯器時(shí),記得確保它支持你所用的版本。 Python 是一門優(yōu)秀的語言,它能讓你在短時(shí)間內(nèi)通過極少量代碼就能完成許多操作。不僅如此,它還輕松支持多任務(wù)處理,比如多進(jìn)程。 不喜歡 Pyt...

    huhud 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<