日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3性能还低吗_谁说Python性能差的?-- 让python比awk快 (3)

發布時間:2023/12/19 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3性能还低吗_谁说Python性能差的?-- 让python比awk快 (3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在(2)中,提到了python字符串慢在了split函數。那既然已經知道這個bottleneck,現在就優化下。

初步思路是用C來定制一個提取第n列數的模塊,然后替換我們的Python版本(1)中的split函數。

下面是一個簡單代碼(示例下而已,不夠好,:-)),用cython。

目錄下有兩個文件,一個是tst.pyx, 一個是setup.py(cython要求的)。

tst.pyx代碼:

fromlibc.stdlib cimport atol

cdef long field2number(char*arr, int index):

cdef int cnt

cdef int i

cdef int start

cdef int end

cnt=0

i=0whileTrue:if arr[i] == ' ':

cnt+= 1

if cnt == index - 1:

start=ibreaki+= 1i= i + 1

while arr[i] != '\n' and arr[i] != ' ':

i+= 1end=i

arr[end]= '\0'

return atol(arr+start)defgetnumber(line,index):

cdef char*p

cdef int i

p=line

i=indexreturn field2number(p,i)

setup.py代碼:

from distutils.core importsetupfrom distutils.extension importExtensionfrom Cython.Distutils importbuild_ext

ext_modules=[

Extension("tst",

["tst.pyx"],

libraries=["m"]) #Unix-like specific

]

setup(

name= "tst",

cmdclass= {"build_ext": build_ext},

ext_modules=ext_modules

)

編譯模塊:

$ python setup.py build_ext -i

running build_ext

skipping'tst.c' Cython extension (up-to-date)

building'tst'extension

gcc-pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c tst.c -o build/temp.linux-x86_64-2.7/tst.o

gcc-pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-x86_64-2.7/tst.o -lm -o /home/dog/dev/test/tst.so

修改的Python版本(1):

importsysfrom tst importgetnumberdefdata_sum():

datasum=0for line insys.stdin:

datasum+= getnumber(line, 3)printdatasumif __name__ == "__main__":

data_sum()

看看效果,數據還是(2)中的比較復雜一點的樣本。

優化后的python:

$ time cat datas.txt |python datasumo.py

49976509700800

real0m2.486s

user0m2.400s

sys0m0.196s

awk呢?

$ time cat datas.txt | awk '{ SUM += $3} END { print SUM }'

49976509700800

real0m3.595s

user0m3.496s

sys0m0.276s

Python比awk還快,有木有?

當然上面的優化,在現實情況意義可能不是很大,畢竟有很多其他方面(維護,兼容等)的考慮。

其實,做系統,關鍵要學會tradeoff,就是平衡各項要求和指標。交付周期,性能,bug數目不可能樣樣好。

所以,我一向喜歡開發速度快的工具,做到整個系統的快速迭代,不斷演進。另外,我認為學習要深入,不要居于表面的各種

技巧。把原理搞通,算法扎實,整個計算機運行過程有個big picture。當實際用到某項技術時候,在更加廣泛的研究他的方方面面,

這是我的經驗,不敢別人也贊同:-)。

總結

以上是生活随笔為你收集整理的python3性能还低吗_谁说Python性能差的?-- 让python比awk快 (3)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。