这是在pandas集团最快的方式吗?
以下代码运行良好。 只要检查一下:我是否正确使用pandas,是否有更快的方法? 谢谢。
$ python3 Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import pandas as pd >>> import numpy as np >>> import timeit >>> pd.__version__ '0.14.1' def randChar(f, numGrp, N) : things = [f%x for x in range(numGrp)] return [things[x] for x in np.random.choice(numGrp, N)] def randFloat(numGrp, N) : things = [round(100*np.random.random(),4) for x in range(numGrp)] return [things[x] for x in np.random.choice(numGrp, N)] N=int(1e8) K=100 DF = pd.DataFrame({ 'id1' : randChar("id%03d", K, N), # large groups (char) 'id2' : randChar("id%03d", K, N), # large groups (char) 'id3' : randChar("id%010d", N//K, N), # small groups (char) 'id4' : np.random.choice(K, N), # large groups (int) 'id5' : np.random.choice(K, N), # large groups (int) 'id6' : np.random.choice(N//K, N), # small groups (int) 'v1' : np.random.choice(5, N), # int in range [1,5] 'v2' : np.random.choice(5, N), # int in range [1,5] 'v3' : randFloat(100,N) # numeric eg 23.5749 })
现在时间5个不同的分组,重复每一个两次,以确认时间。 [我意识到timeit(2)
运行两次,但它然后报告总数。 我感兴趣的是第一次和第二次分别运行的时间。]在这些testing中,Python根据htop
使用大约10G的RAM。
>>> timeit.Timer("DF.groupby(['id1']).agg({'v1':'sum'})" ,"from __main__ import DF").timeit(1) 5.604133386000285 >>> timeit.Timer("DF.groupby(['id1']).agg({'v1':'sum'})" ,"from __main__ import DF").timeit(1) 5.505057081000359 >>> timeit.Timer("DF.groupby(['id1','id2']).agg({'v1':'sum'})" ,"from __main__ import DF").timeit(1) 14.232032927000091 >>> timeit.Timer("DF.groupby(['id1','id2']).agg({'v1':'sum'})" ,"from __main__ import DF").timeit(1) 14.242601240999647 >>> timeit.Timer("DF.groupby(['id3']).agg({'v1':'sum', 'v3':'mean'})" ,"from __main__ import DF").timeit(1) 22.87025260900009 >>> timeit.Timer("DF.groupby(['id3']).agg({'v1':'sum', 'v3':'mean'})" ,"from __main__ import DF").timeit(1) 22.393589012999655 >>> timeit.Timer("DF.groupby(['id4']).agg({'v1':'mean', 'v2':'mean', 'v3':'mean'})" ,"from __main__ import DF").timeit(1) 2.9725865330001398 >>> timeit.Timer("DF.groupby(['id4']).agg({'v1':'mean', 'v2':'mean', 'v3':'mean'})" ,"from __main__ import DF").timeit(1) 2.9683854739996605 >>> timeit.Timer("DF.groupby(['id6']).agg({'v1':'sum', 'v2':'sum', 'v3':'sum'})" ,"from __main__ import DF").timeit(1) 12.776488024999708 >>> timeit.Timer("DF.groupby(['id6']).agg({'v1':'sum', 'v2':'sum', 'v3':'sum'})" ,"from __main__ import DF").timeit(1) 13.558292575999076
这里是系统信息:
$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 32 On-line CPU(s) list: 0-31 Thread(s) per core: 2 Core(s) per socket: 8 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 62 Stepping: 4 CPU MHz: 2500.048 BogoMIPS: 5066.38 Hypervisor vendor: Xen Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 25600K NUMA node0 CPU(s): 0-7,16-23 NUMA node1 CPU(s): 8-15,24-31 $ free -h total used free shared buffers cached Mem: 240G 74G 166G 372K 33M 550M -/+ buffers/cache: 73G 166G Swap: 0B 0B 0B
我不相信这是相关的,但万一上面的randChar
函数是randChar
中的内存错误的解决方法:
如何解决mtrand.RandomState.choice中的内存错误?
如果您想安装iPython shell,您可以使用%timeit轻松地计时。 安装完成后,不用键入python
来启动python解释器,而是inputipython
。
然后,您可以按照在正常解释器中键入代码的方式键入代码(如上所述)。
然后你可以input,例如:
%timeit DF.groupby(['id1']).agg({'v1':'sum'})
这将完成与你所做的完全相同的事情,但如果你使用python很多,我发现这将为你节省大量的打字时间:)。
Ipython还有很多其他很好的function(比如%paste
,我用它来粘贴你的代码和testing这个,或者%run
来运行你保存在一个文件中的脚本),tab完成等等。 ipython.org/