早下班系列 | 比python更稱手的兵器
有人覺得這標(biāo)題有點(diǎn)兒像王婆賣瓜?其實(shí)要說我一開始也不是很自信。畢竟看了這篇文章里寫的信誓旦旦的:《為什么你經(jīng)常加班,卻干不過那些準(zhǔn)點(diǎn)開溜的同事?》,再加之久仰Python的鼎鼎大名,且看過的Python的教材的前言中提到許許多多強(qiáng)調(diào)Python的優(yōu)點(diǎn):語(yǔ)法簡(jiǎn)單、容易上手、世間***的正義等等(對(duì)比的當(dāng)然是著名的反人類C++和潛在的反人類JAVA),我也不禁懷疑了:要做得比Python還爽,需要做到什么地步?
先看看環(huán)境實(shí)現(xiàn)、代碼編寫的效率
鑒于我是一個(gè)愛折騰的碼農(nóng),又自負(fù)有那么點(diǎn)Python的基礎(chǔ),借著害死貓的好奇心驅(qū)使,便打算試試手:看看這Python到底有多簡(jiǎn)便。
要搞Python,***步當(dāng)然是安裝Python解釋器,那么問題來了:選Python2還是Python3?雖然看起來只是版本升級(jí),但其實(shí)卻是連語(yǔ)法都換代(不是升級(jí)的意思,Python3不能完全兼容Python2語(yǔ)法)。雖然有Python牛人說“語(yǔ)言不是問題,重點(diǎn)在于思想巴拉巴拉……”,但對(duì)于瑟瑟發(fā)抖的新人們來說,我想大多還是不希望看到:因?yàn)槿眰€(gè)括號(hào),就連print都出不來Hello World了……這樣的鬧心事吧?對(duì)比了種種網(wǎng)上意見,***還是決定支持先進(jìn):選Python3。這樣就算過幾年再出個(gè)語(yǔ)法換代的Python4、Python5啥的,至少我的Python3能比別人的Python2多活個(gè)幾年。
安裝完解釋器,再選一個(gè)寫代碼的編輯器。因?yàn)樽罱?xí)慣用eclipse——開源、跨平臺(tái)、免安裝,且支持多種插件——所以我決定在eclipse上安裝個(gè)pydev來實(shí)現(xiàn)支持python編程的功能。百度上找了一個(gè)最簡(jiǎn)便的方法:網(wǎng)上在線安裝。結(jié)果安好之后發(fā)現(xiàn)找不著pydev?再百度找問題,發(fā)現(xiàn)竟是pydev的版本太新了。只好先卸了再對(duì)照eclipse和jdk版本找了一個(gè)恰到好處的,一邊百度一邊實(shí)驗(yàn),一個(gè)小時(shí)總算搞定。速度很慢?要知道網(wǎng)上可是有人自述弄了整整一個(gè)下午。所以對(duì)這一點(diǎn)我還是蠻佩服自己的。
安完編程環(huán)境后,總該爽一下了吧?先print個(gè)Hello World?***!再找之前的文章copy一下代碼……嗯?***行import pandas報(bào)錯(cuò)?缺少pandas的庫(kù)?這么重要的科學(xué)計(jì)算常用庫(kù)為啥這python安裝時(shí)就不自帶一下???還是自己安吧……
上網(wǎng)繼續(xù)百度……發(fā)現(xiàn)有說安一個(gè)anaconda……但那樣我之前安的python和pydev不是都白費(fèi)了?且anaconda自帶的編輯器spyder編寫復(fù)雜工程不夠強(qiáng)大又容易崩潰,還有有很多anaconda沒有的庫(kù)你自己再添加又不知有沒有什么兼容之類巴拉巴拉的問題……否決。直接安裝個(gè)pandas庫(kù)呢?也不行,還有一大堆pandas需要的亂七八糟的其他庫(kù)等著你呢(linux一族的通?。?。用pip工具安裝?沒有外網(wǎng)不行,不過還好我有。但前提是得先安pip工具本身。怎么安裝?源碼編譯……萬(wàn)幸!大學(xué)英語(yǔ)沒忘光,摸著英文線索一路搞到了pip的源碼文件,瑟瑟發(fā)抖的編譯通過后(此處需要使用之前的python環(huán)境),再?gòu)陌俣壬险乙粋€(gè)用pip安裝pandas庫(kù)的詳細(xì)教程,附帶pip pandas所有必須支持庫(kù)的網(wǎng)址,一頓pip下來后(此處需要命令行),再回eclipse中繼續(xù)試驗(yàn)import pandas……居然還不行?。?!什么情況?抱著死馬當(dāng)活馬醫(yī)的心理,打開了python的命令行工具:python shell,試試在python shell中import pandas行不行?竟然又行了!再回eclipse里繼續(xù)測(cè)試,也正常了!個(gè)中原因太過玄幻,還是找一位python界的大神來解釋吧……
到這一步,總算可以開始最早提到的那篇文章中的python編程了。回到之前提到的《為什么你經(jīng)常加班,卻干不過那些準(zhǔn)點(diǎn)開溜的同事?》這篇文章,原文中竟然是用程序代碼中的字符串做表數(shù)據(jù)源……將數(shù)據(jù)寫到程序里感覺也太山寨了點(diǎn),這樣改數(shù)據(jù)難道還得改程序不成?而且如果數(shù)據(jù)過大,導(dǎo)致內(nèi)存裝不下怎么辦?又或者數(shù)據(jù)想跨程序使用又該怎么辦?所以咱至少寫個(gè)文本文件之類的外存文件做數(shù)據(jù)源。
接下來就是編程了,除了加了***步的讀文件操作之外,其他都跟原文一樣
- import pandas
- f = open(‘D:/data.txt’, ‘r‘)
- try:
- a = f.read( )
- finally:
- f.close( )
- b = []
- for i in a.split(“\n”):
- b.append(i.split(” “))
- for i in range(1, len(b)):
- b[i][4] = b[i][4].replace(“$”,‘ ‘)
- b[i][4] = b[i][4].replace(“,”,‘ ‘)
- for i in range(1, len(b)):
- for j in [1, 2, 3, 4]:
- b[i][j] = eval(b[i][j])
- data = pandas.DataFrame(b[1:],columns=b[0])
- out = data.groupby([‘STYLE’,‘BEDROOMS’]).mean()
- print(out)
運(yùn)算結(jié)果也一致
簡(jiǎn)單嗎?照比C++,那是簡(jiǎn)單得很,但如果對(duì)比集算器呢?
集算器的安裝咱就不說了,非得要問?那你一定是在逗我……
先上集算器的程序:真不是欺負(fù)你,就三行代碼,而且連一個(gè)循環(huán)都用不著寫!實(shí)際上,如果不是***一列字段的數(shù)據(jù)有點(diǎn)特殊需要處理一下,兩行就可以搞定
A | |
1 | =file(“D:/data.txt”).cursor@t(#1,#2:int,#3:int,#4:float,#5;,” “) |
2 | =A2.run(int(replace(replace(#5,”$”,””),”,”,””)):PRICE) |
3 | =A3.groups(STYLE,BEDROOMS;avg(SQFEET):SQFEET,avg(BATHS):BATHS,avg(PRICE):PRICE) |
再看看計(jì)算的結(jié)果:與python完全一致
如果你還是有些猶豫的話,那么不妨再透露一個(gè)重要的內(nèi)幕:集算器的這種使用處理方法(游標(biāo)),是可以支持大數(shù)據(jù)處理的,而且只要再加個(gè)選項(xiàng)還可以支持多線程并行計(jì)算。而上面的python算法要支持大量數(shù)據(jù),那改起來可就不是一句兩句能完事的了,再上個(gè)多線程并行計(jì)算?我感覺您可能需要的是一位有多年python編程經(jīng)驗(yàn)的老鳥……
再看看代碼運(yùn)算的效率
***,不妨加入計(jì)時(shí)代碼,看看運(yùn)行程序消耗的時(shí)間。
先加python的計(jì)時(shí)代碼(友情提示:計(jì)時(shí)單位是秒)
- import pandas
- import time
- start = time.clock()
- f = open(‘D:/data2.txt‘, ‘r’)
- try:
- a = f.read( )
- finally:
- f.close( )
- b = []
- for i in a.split(“\n”):
- b.append(i.split(” “))
- for i in range(1, len(b)):
- b[i][4] = b[i][4].replace(“$”,‘ ‘)
- b[i][4] = b[i][4].replace(“,”,‘ ‘)
- for i in range(1, len(b)):
- for j in [1, 2, 3, 4]:
- b[i][j] = eval(b[i][j])
- data = pandas.DataFrame(b[1:],columns=b[0])
- out = data.groupby([‘STYLE’,‘BEDROOMS’]).mean()
- elapsed = (time.clock() – start)
- print(elapsed)
鑒于原有數(shù)據(jù)文件太小,體驗(yàn)不出什么差距,不如干脆做大一些,能更有對(duì)比價(jià)值。就做個(gè)22.3M的文本文件(就是把原有數(shù)據(jù)不斷復(fù)制粘貼來把文件撐大一點(diǎn))
先測(cè)試Python:
為了不讓eclipse影響運(yùn)行速度,這里干脆拿到命令行里執(zhí)行(elicpse:俺不背鍋?。?nbsp;
再次友情提示:python這里計(jì)時(shí)使用的單位是秒……嗯,處理22.3M的數(shù)據(jù)30多秒……還好我一直堅(jiān)持等下去,沒誤以為已經(jīng)卡死,給他來個(gè)Ctrl+C……
然后再看看集算器,也加入計(jì)時(shí)代碼(友情提示:使用@ms選項(xiàng)后計(jì)時(shí)單位是毫秒)
A | |
1 | =now() |
2 | =file(“D:/data.txt”).cursor@t(#1,#2:int,#3:int,#4:float,#5;,” “) |
3 | =A2.run(int(replace(replace(#5,”$”,””),”,”,””)):PRICE) |
4 | =A3.groups(STYLE,BEDROOMS;avg(SQFEET):SQFEET,avg(BATHS):BATHS,avg(PRICE):PRICE) |
5 | =interval@ms(A1,now()) |
然后再看看耗時(shí)(點(diǎn)擊A5格就會(huì)在右側(cè)顯示計(jì)算出來的計(jì)時(shí)數(shù)值)
1391毫秒約等于1.4秒(請(qǐng)注意此處有個(gè)小數(shù)點(diǎn)……)
看到這樣的對(duì)比結(jié)果,我覺得啥也不用說了,請(qǐng)大家自己用心去體會(huì)(我也就不得寸進(jìn)尺地說:其實(shí)集算器好多加速方法還沒用上呢……畢竟太欺負(fù)人了不好……)