更新:显然,我只是在计时Python读取列表的速度。不过,这并不能真正改变我的问题。你知道吗
所以,前几天我读了this post,想比较一下速度。我刚接触熊猫,所以每当我看到有机会做一些适度有趣的事情时,我都会欣然接受。不管怎样,我最初只是用100个数字来测试这个,我想这足以满足我和熊猫玩耍的渴望。但这张图是这样的:
请注意,有3个不同的运行。这些跑步是按顺序进行的,但它们在同一个两点上都有一个尖峰。斑点大约是28和64个。所以我最初的想法是它和字节有关,特别是4。可能第一个字节包含关于它是一个列表的附加信息,然后下一个字节是所有数据,之后每4个字节会导致一个速度峰值,这有点合理。所以我需要用更多的数字来测试。所以我创建了一个由3组数组组成的数据帧,每个数组有1000个列表,长度从0到999不等。然后我以同样的方式对它们进行计时,即:
Run 1: 0, 1, 2, 3, ...
Run 2: 0, 1, 2, 3, ...
Run 3: 0, 1, 2, 3, ...
我希望看到的是数组中大约每32个项目就有一个显著的增加,但是没有重复出现这种模式(我确实放大并寻找尖峰):
然而,你会注意到,它们在400和682之间都有很大的不同。奇怪的是,我总是在同一个地方跑一个尖峰,这使得在这张图的28点和64点上的模式更难区分。绿线真的到处都是。可耻的。你知道吗
问题:最初的两个峰值发生了什么,为什么在400和682之间的图上会变得“模糊”?我刚刚完成了对0-99集的测试,但这次对数组中的每个项进行了简单的加法,结果是完全线性的,所以我认为这与字符串有关。你知道吗
我先用其他方法进行了测试,得到了相同的结果,但是由于我加入了错误的结果,所以图形被弄乱了,所以我用这段代码在一夜之间再次运行它(这花费了很长时间),以确保时间与索引正确对齐,并且运行的顺序正确:
import statistics as s
import timeit
df = pd.DataFrame([[('run_%s' % str(x + 1)), r, np.random.choice(100, r).tolist()]
for r in range(0, 1000) for x in range(3)],
columns=['run', 'length', 'array']).sort_values(['run', 'length'])
df['time'] = df.array.apply(lambda x: s.mean(timeit.repeat(str(x))))
# Graph
ax = df.groupby(['run', 'length']).mean().unstack('run').plot(y='time')
ax.set_ylabel('Time [ns]')
ax.set_xlabel('Array Length')
ax.legend(loc=3)
如果您想查看原始数据,我也会对数据帧进行pickle处理。你知道吗
在这里使用
pandas
和.apply
会严重地使事情过于复杂。没有必要-这只是效率低下。就用香草Python的方式:注意,
timeit
函数接受一个number
参数,它是所有函数运行的次数。它默认为1000000
,所以让我们通过使用number=100
使其更合理,这样我们就不必永远等待了。。。你知道吗目视检查结果:
在我看来,这是非常糟糕的线性。现在,
pandas
是一种方便的图形化方法,特别是如果您希望在matplotlib
的API周围有一个方便的包装器:结果如下:
这应该会让你在正确的轨道上,真正的时间,你一直试图时间。正如我在评论中所解释的那样,你结束的时间是:
我只能推测你所看到的结果是什么样的模式,但这很可能取决于解释器/硬件。以下是我在机器上的发现:
使用一个不是很大的范围:
结果是:
我想这有点像你的。不过,也许这更适合它自己的问题。你知道吗
相关问题 更多 >
编程相关推荐