iT邦幫忙

DAY 17
2

用python擷取網頁上的開放資訊(數據資料),分析及畫出圖表系列 第 13

python抓網頁data,及做圖表之十七:抓83年到目前的月均股價遭遇效能問題

  • 分享至 

  • xImage
  •  

人性中總是有喜歡把簡單的事情複雜化的不良成分。
巴菲特

昨晚花了一個多小時才抓完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()
22

IOError: [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很多行怎麼辦,沒關係,可以用**分號;**寫在一行裏。

時代日新月異,沒想到有這種手法來計時,又很直覺,又有量測數字,執行次數可以自訂,一次,兩次不準的話,可以多跑幾次,取一個均值,實在設想周到。

筆者對自己的孤陋寡聞,真是深深慚愧。


上一篇
用python抓網頁data,及做圖表之十二:EPS及股價
下一篇
python抓網頁data,及做圖表之十八:自動化畫圖
系列文
用python擷取網頁上的開放資訊(數據資料),分析及畫出圖表22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

我要留言

立即登入留言