早下班系列 | 比python更称手的兵器

企业动态
看了这篇文章里写的信誓旦旦的:《为什么你经常加班,却干不过那些准点开溜的同事?》,再加之久仰Python的鼎鼎大名,且看过的Python的教材的前言中提到许许多多强调Python的优点:语法简单、容易上手、世间最后的正义等等,我也不禁怀疑了:要做得比Python还爽,需要做到什么地步?

[[217563]]

有人觉得这标题有点儿像王婆卖瓜?其实要说我一开始也不是很自信。毕竟看了这篇文章里写的信誓旦旦的:《为什么你经常加班,却干不过那些准点开溜的同事?》,再加之久仰Python的鼎鼎大名,且看过的Python的教材的前言中提到许许多多强调Python的优点:语法简单、容易上手、世间***的正义等等(对比的当然是著名的反人类C++和潜在的反人类JAVA),我也不禁怀疑了:要做得比Python还爽,需要做到什么地步?

先看看环境实现、代码编写的效率

鉴于我是一个爱折腾的码农,又自负有那么点Python的基础,借着害死猫的好奇心驱使,便打算试试手:看看这Python到底有多简便。

要搞Python,***步当然是安装Python解释器,那么问题来了:选Python2还是Python3?虽然看起来只是版本升级,但其实却是连语法都换代(不是升级的意思,Python3不能完全兼容Python2语法)。虽然有Python牛人说“语言不是问题,重点在于思想巴拉巴拉……”,但对于瑟瑟发抖的新人们来说,我想大多还是不希望看到:因为缺个括号,就连print都出不来Hello World了……这样的闹心事吧?对比了种种网上意见,***还是决定支持先进:选Python3。这样就算过几年再出个语法换代的Python4、Python5啥的,至少我的Python3能比别人的Python2多活个几年。

安装完解释器,再选一个写代码的编辑器。因为最近习惯用eclipse——开源、跨平台、免安装,且支持多种插件——所以我决定在eclipse上安装个pydev来实现支持python编程的功能。百度上找了一个最简便的方法:网上在线安装。结果安好之后发现找不着pydev?再百度找问题,发现竟是pydev的版本太新了。只好先卸了再对照eclipse和jdk版本找了一个恰到好处的,一边百度一边实验,一个小时总算搞定。速度很慢?要知道网上可是有人自述弄了整整一个下午。所以对这一点我还是蛮佩服自己的。

安完编程环境后,总该爽一下了吧?先print个Hello World?***!再找之前的文章copy一下代码……嗯?***行import pandas报错?缺少pandas的库?这么重要的科学计算常用库为啥这python安装时就不自带一下啊?还是自己安吧……

上网继续百度……发现有说安一个anaconda……但那样我之前安的python和pydev不是都白费了?且anaconda自带的编辑器spyder编写复杂工程不够强大又容易崩溃,还有有很多anaconda没有的库你自己再添加又不知有没有什么兼容之类巴拉巴拉的问题……否决。直接安装个pandas库呢?也不行,还有一大堆pandas需要的乱七八糟的其他库等着你呢(linux一族的通病)。用pip工具安装?没有外网不行,不过还好我有。但前提是得先安pip工具本身。怎么安装?源码编译……万幸!大学英语没忘光,摸着英文线索一路搞到了pip的源码文件,瑟瑟发抖的编译通过后(此处需要使用之前的python环境),再从百度上找一个用pip安装pandas库的详细教程,附带pip pandas所有必须支持库的网址,一顿pip下来后(此处需要命令行),再回eclipse中继续试验import pandas……居然还不行!!!什么情况?抱着死马当活马医的心理,打开了python的命令行工具:python shell,试试在python shell中import pandas行不行?竟然又行了!再回eclipse里继续测试,也正常了!个中原因太过玄幻,还是找一位python界的大神来解释吧……

到这一步,总算可以开始最早提到的那篇文章中的python编程了。回到之前提到的《为什么你经常加班,却干不过那些准点开溜的同事?》这篇文章,原文中竟然是用程序代码中的字符串做表数据源……将数据写到程序里感觉也太山寨了点,这样改数据难道还得改程序不成?而且如果数据过大,导致内存装不下怎么办?又或者数据想跨程序使用又该怎么办?所以咱至少写个文本文件之类的外存文件做数据源。

接下来就是编程了,除了加了***步的读文件操作之外,其他都跟原文一样 

  1. import pandas 
  2.  
  3. f = open(‘D:/data.txt’, ‘r‘) 
  4.  
  5. try: 
  6.  
  7. a = f.read( ) 
  8.  
  9. finally: 
  10.  
  11. f.close( ) 
  12.  
  13. b = [] 
  14.  
  15. for i in a.split(“\n”): 
  16.  
  17. b.append(i.split(” “)) 
  18.  
  19. for i in range(1, len(b)): 
  20.  
  21. b[i][4] = b[i][4].replace(“$”,‘ ‘) 
  22.  
  23. b[i][4] = b[i][4].replace(“,”,‘ ‘) 
  24.  
  25. for i in range(1, len(b)): 
  26.  
  27. for j in [1, 2, 3, 4]: 
  28.  
  29. b[i][j] = eval(b[i][j]) 
  30.  
  31. data = pandas.DataFrame(b[1:],columns=b[0]) 
  32.  
  33. out = data.groupby([‘STYLE’,‘BEDROOMS’]).mean() 
  34.  
  35. print(out) 

运算结果也一致

简单吗?照比C++,那是简单得很,但如果对比集算器呢?

集算器的安装咱就不说了,非得要问?那你一定是在逗我……

先上集算器的程序:真不是欺负你,就三行代码,而且连一个循环都用不着写!实际上,如果不是***一列字段的数据有点特殊需要处理一下,两行就可以搞定

  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)

再看看计算的结果:与python完全一致 

 

如果你还是有些犹豫的话,那么不妨再透露一个重要的内幕:集算器的这种使用处理方法(游标),是可以支持大数据处理的,而且只要再加个选项还可以支持多线程并行计算。而上面的python算法要支持大量数据,那改起来可就不是一句两句能完事的了,再上个多线程并行计算?我感觉您可能需要的是一位有多年python编程经验的老鸟…… 

再看看代码运算的效率 

***,不妨加入计时代码,看看运行程序消耗的时间。 

先加python的计时代码(友情提示:计时单位是秒)  

  1. import pandas 
  2.  
  3. import time 
  4.  
  5. start = time.clock() 
  6.  
  7. f = open(‘D:/data2.txt‘, ‘r’) 
  8.  
  9. try: 
  10.  
  11. a = f.read( ) 
  12.  
  13. finally: 
  14.  
  15. f.close( ) 
  16.  
  17. b = [] 
  18.  
  19. for i in a.split(“\n”): 
  20.  
  21. b.append(i.split(” “)) 
  22.  
  23. for i in range(1, len(b)): 
  24.  
  25. b[i][4] = b[i][4].replace(“$”,‘ ‘) 
  26.  
  27. b[i][4] = b[i][4].replace(“,”,‘ ‘) 
  28.  
  29. for i in range(1, len(b)): 
  30.  
  31. for j in [1, 2, 3, 4]: 
  32.  
  33. b[i][j] = eval(b[i][j]) 
  34.  
  35. data = pandas.DataFrame(b[1:],columns=b[0]) 
  36.  
  37. out = data.groupby([‘STYLE’,‘BEDROOMS’]).mean() 
  38.  
  39. elapsed = (time.clock() – start) 
  40.  
  41. print(elapsed)  

鉴于原有数据文件太小,体验不出什么差距,不如干脆做大一些,能更有对比价值。就做个22.3M的文本文件(就是把原有数据不断复制粘贴来把文件撑大一点) 

 

先测试Python: 

为了不让eclipse影响运行速度,这里干脆拿到命令行里执行(elicpse:俺不背锅!)  

 

再次友情提示:python这里计时使用的单位是秒……嗯,处理22.3M的数据30多秒……还好我一直坚持等下去,没误以为已经卡死,给他来个Ctrl+C…… 

然后再看看集算器,也加入计时代码(友情提示:使用@ms选项后计时单位是毫秒) 

  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())

然后再看看耗时(点击A5格就会在右侧显示计算出来的计时数值)

 

1391毫秒约等于1.4秒(请注意此处有个小数点……) 

看到这样的对比结果,我觉得啥也不用说了,请大家自己用心去体会(我也就不得寸进尺地说:其实集算器好多加速方法还没用上呢……毕竟太欺负人了不好……) 

责任编辑:庞桂玉 来源: 润乾
相关推荐

2018-03-15 14:53:24

润乾python

2018-03-15 14:07:17

润乾Excel行列转换

2021-02-07 22:27:27

UI工具网站

2022-11-13 08:06:05

ArthasEverythingMaven help

2024-02-05 22:51:49

AGIRustPython

2009-09-17 10:00:15

Linux虚拟化Windows

2013-03-25 11:27:13

Windows Blu

2015-07-31 16:29:15

DockerJavaLinux

2019-04-24 08:00:00

HTTPSHTTP前端

2014-12-01 09:52:57

开发

2021-12-27 07:10:26

ClassmethodStaticmetho函数

2012-12-28 14:02:47

2021-11-30 11:56:52

Pixel 6iPhone 12安全

2017-11-15 10:29:13

戴尔

2018-06-08 11:17:11

2022-03-11 13:13:15

LinuxWindows

2022-07-25 07:57:19

工具代码调试

2023-12-14 15:32:17

2021-02-15 12:09:17

虚拟机Docker Linux

2015-10-20 14:21:23

交换机SDN
点赞
收藏

51CTO技术栈公众号