人性中總是有喜歡把簡單的事情複雜化的不良成分。
巴菲特
昨晚花了一個多小時才抓完data,
中間還遇到
IOError Traceback (most recent call last)
<ipython-input-12-eac36179b9a5> in <module>()
19 f = open(fnm,'w')
20 f.write(s)
---> 21 f.close()
22IOError: [Errno 28] No space left on device
磁碟空間用完了!!
昨晚彈性疲乏,復習女兒國一生物又讓人疲憊+2。沒法多想,睡了一覺後,
早上找到一些有趣的東西來測量。
在官網文件中http://docs.python.org/3.3/library/timeit.html,在標準庫的27章基本上是在講除錯和效能(Debugging and Profiling)。
有些講程式語法的分享,雖然語法當然在30天內講不完,但是,通常語法(文法)實在沒必要講太多,
畢竟沒有人真的會按按步就班的一句句來寫程式。語法(文法)是拿來查的,而
該深入的程式議題,常常是除錯和效能,常常這部分又和語法(文法)沒太大關係, 和操作有關。
寫了python一段時間,都沒用到單步除錯(F2/F3, 還是F10/F11),這樣也能寫。
自己也覺得驚訝。只是PO文的主題也不是程式語言,寫這些也是離題。純討論實作時產生的問題及解決。
筆者的效能異常程式,
動作大約是,
1。 先下sql從db抓出有財務分析年報的上市公司代號
2。按公司代號組成URL
3。連上証交所網站,抓csv格式的內文。
4。開檔,寫回檔案。
在檔案總管裏,看著程式慢慢的寫回csv檔案。一秒兩三個檔案。
可是動作雖慢,就是沒發生timeout, 或是URLOPEN ERROR的異常中斷。
大概可以推測磁碟IO可能是拖慢速度的元兇。沒多久,磁碟空間又滿了。
當下,閃出的念頭:直接把網頁裏data找規則擷取出來,幹嘛繞個彎,存成csv檔案,之後又要
開檔來讀data。那時沒往量測的角度來思考,會先想到換個寫法試試!這些中繼的檔案之後也是刪掉。
回到主旨,
標準庫手冊上,27.5. timeit — Measure execution time of small code snippets,中文意思是,量測程式片段的執行時間。
首先給一段小程式:
它的目的,可能是range這個迴圈效果的好用指令的時間損耗。
"-".join(str(n) for n in range(100))
output:
'0-1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-33-34-35-36-37-38-39-40-41-42-43-44-45-46-47-48-49-50-51-52-53-54-55-56-57-58-59-60-61-62-63-64-65-66-67-68-69-70-71-72-73-74-75-76-77-78-79-80-81-82-83-84-85-86-87-88-89-90-91-92-93-94-95-96-97-98-99'
手冊上寫,可以這樣測時間,
timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
Out[122]: 0.39031828915528877
這裏比較特別的地方,number=10000,number executions,執行的次數,
為什麼範例寫1萬次呢?如果不寫,抱歉,預設值是百萬次。
timeit.timeit('"-".join(str(n) for n in range(100))')
Out[120]: 37.33263569803256
,
換一下執行次數來看時間。
In [123]: timeit.timeit('"-".join(str(n) for n in range(100))', number=1000000)
Out[123]: 36.67819967746658
In [124]: timeit.timeit('"-".join(str(n) for n in range(100))', number=100)
Out[124]: 0.01210221875624029
In [125]: timeit.timeit('"-".join(str(n) for n in range(100))', number=10)
Out[125]: 0.0009915959755062431
如果code很多行怎麼辦,沒關係,可以用**分號;**寫在一行裏。
時代日新月異,沒想到有這種手法來計時,又很直覺,又有量測數字,執行次數可以自訂,一次,兩次不準的話,可以多跑幾次,取一個均值,實在設想周到。
筆者對自己的孤陋寡聞,真是深深慚愧。