由于实在没找到或者下载到大数据,只能自己编个不大不小的数据。
给定初始金额s,2个人轮流拿,头一个人可以拿n个(n<= s-1),第二个人可以拿n_2 = 1~2n个,然后刚才那第一人可以拿1~2(n_2)个,也就是之后的人都能在1到上一个人拿的2倍之间拿钱,最后一个拿的胜利。这是一个类是巴什博弈的问题,用动态规划来解,推导到5000的情况。存了624万种博弈可能(当然有很多冗余没剔除,毕竟推导到5000,D(x,5000)的情况是不用存储的)
使用字符串存储为CSV格式,大小332MB。
read_csv()读取时间:
7.825 sec
数据第一列是动态规划的“状态”,第二列是“适应与否”,第三列是必赢策略中可进入的上一个状态(多个状态用空格隔开)。状态描述为:
D(n,s) —— s代表到“我”拿的时候剩余多少钱,n表示到我的时候上家拿了多少钱。
用了用比较pandas里面比较有意思的语句:选关键的行和列
print resultData.loc[
10:20, [
'D(1-1)',
'Unnamed: 2']]
对象使用loc方法,即可选用行和列。这里输入的行,采用了python式的冒号选择法,即第11行(从0开始,编号为10即第11行)到第21行。列选择了
D(1-1)列和
Unnamed: 2列。
似乎直接使用默认的csv读取函数,不加额外参数的话,pandas依然会把第一行当成标题。而我所制作的数据里面,第一行就是数据,没有给标题,结果它直接把我的数据给默认成标题了,如D(1-1)。而没有数据的部分,则给了个unnamed: 2作为标题。更郁闷的是,莫名其妙我多了一列空数据Unnamed: 3……Orz
我们看看读取方面。不加列选择的读取:
print resultData[0:10]
用时:
0.00399994850159 sec
选择个别列与行的读取:
print resultData.loc[10:20, ['D(1-1)', 'Unnamed: 2']]
用时:
0.276999950409 sec (强烈怀疑大部分时间是不是都消耗在了字符串查找上了)
其他的语句方面,似乎pandas提供了更快的标量读取方法?
For getting a scalar value
For getting fast access to a scalar (equiv to the prior method)
于是我们来测试下单个数据读取的情况:
print resultData.loc[30, 'Unnamed: 2'], resultData.loc[43453, 'Unnamed: 2'], resultData.loc[6001234, 'Unnamed: 2']
print resultData.at[30, 'Unnamed: 2'], resultData.at[43453, 'Unnamed: 2'], resultData.at[6001234, 'Unnamed: 2']
print resultData.iloc[40, 1], resultData.iloc[402134, 2], resultData.iloc[4032, 3]
由于速度太快,三条语句都无法对比:
无论是iloc、loc还是at方法,测算的结果都是
0.0sec
我们来看看按照行数和列数来读取(使用int而不是String来查找行和列)
print resultData.iloc[30]
使用这条语句,花费了:
0.00200009346008 sec
print resultData.iloc[
3:5,
0:2]
使用这条语句,花费了:
0.003 sec
这个连续选取行和列的语句有个值得注意的地方,这里的
3:5是指第三行到第四行,
0:2是指第0列到第1列,它并没有把后面数字所指示的行和列包含进去。如果你要
选取第3、4、5行,则应该输入3:6。对于列,输入的规则也是一样。为了避免歧义,数据量不大的情况下,可以选择使用下面的语句:
print resultData.iloc[[3, 4, 5, 7, 8, 9], [1, 2, 3]]
使用这条语句,花费了:
0.003 sec
综合感觉来看,只要是选择具体的行和列的,都会花些时间。单独选取某行和某单元格,花费的时间不算多。具体抽取数据所需要的时间受cpu和内存是否预热影响很大,结果仅作参考。单个读取数据,pandas同样提供了数值int访问方式:
For getting a value explicitly
For getting fast access to a scalar (equiv to the prior method)
总结:如果使用标签访问,那么就不加i,直接用at、loc。如果使用序号访问,那么就加上i,如iat、iloc