您能否详细说明您是如何计算查找时间的指数?
如果它确实是指数的,也许你可以加快速度通过在你的钥匙(配置)使用Hash
,然后存储键值对像{{key1,value1},{key2,value2}}
列表,不停地通过key
排序,然后使用二进制搜索(这应该记录时间)。这应该是非常快速的编码,但在速度方面不是最佳的。
如果这还不够快,可以考虑设置一个合适的哈希表实现(我认为这是f[{0,1,0,1}]=3
方法做的,没有检查)。
但放缓的一些玩具例子是进一步进行有益的......
编辑:我只是想
test[length_] := Block[{f},
Do[
f[RandomInteger[{0, 10}, 100]] = RandomInteger[0, 10];,
{i, 1, length}
];
f[{0, 0, 0, 0, 1, 7, 0, 3, 7, 8, 0, 4, 5, 8, 0, 8, 6, 7, 7, 0, 1, 6,
3, 9, 6, 9, 2, 7, 2, 8, 1, 1, 8, 4, 0, 5, 2, 9, 9, 10, 6, 3, 6,
8, 10, 0, 7, 1, 2, 8, 4, 4, 9, 5, 1, 10, 4, 1, 1, 3, 0, 3, 6, 5,
4, 0, 9, 5, 4, 6, 9, 6, 10, 6, 2, 4, 9, 2, 9, 8, 10, 0, 8, 4, 9,
5, 5, 9, 7, 2, 7, 4, 0, 2, 0, 10, 2, 4, 10, 1}] // timeIt
]
与timeIt
定义以准确的时间,即使短期运行如下:
timeIt::usage = "timeIt[expr] gives the time taken to execute expr,
repeating as many times as necessary to achieve a total time of \
1s";
SetAttributes[timeIt, HoldAll]
timeIt[expr_] := Module[{t = Timing[expr;][[1]], tries = 1},
While[t < 1.,
tries *= 2;
t = Timing[Do[expr, {tries}];][[1]];
];
Return[t/tries]]
然后
out = {#, test[#]} & /@ {10, 100, 1000, 10000, 100000, 100000};
[email protected]
(也适用于较大的运行)。所以在这里似乎不变。
无模式DownValue查找使用哈希,并分摊和适当的内存限制,恒定的时间。不管是什么导致你的速度问题,它本身不可能是单独的查找时间。 –