【发布时间】:2015-02-08 01:25:54
【问题描述】:
我有来自 Project Euler 的以下问题的 3 个解决方案。
如果 p 是一个整数长度的直角三角形的周长 边,{a,b,c},对于 p = 120,恰好有三个解。
{20,48,52},{24,45,51},{30,40,50}
对于 p ≤ 1000 的哪个值,解的数量是否最大?
我为每种语言提供的三种解决方案如下。
C++:
boost::chrono::steady_clock::time_point start_time = boost::chrono::steady_clock::now();
map<int, int> square_lookup;
for(int i=0; i<= 1500; i++) {
square_lookup[i*i] = i ;
}
auto end_time = boost::chrono::steady_clock::now();
Python2:
start = time.time()
res = range(1, 1501)
squares = {}
#square_lookups = dict(zip([x*x for x in res], res))
square_lookups = {}
for x in range(1, 1501):
square_lookups[x*x] = x
end = time.time()
鲁比:
start_time = Time.now
square_lookup = {}
(1 .. 1500).map {|x| x*x}.each_with_index do |square, root|
square_lookup[square] = root+1
end
end_time = Time.now
四核 i5 的时序:
> lookup gen time: 0.00141787528992
> Python Result: 840 Time:
> 0.282248973846
>
> Lookup gen time 4640960 nanoseconds
> C++: Result: 840 : Time: 695301578 nanoseconds
>
>
> Lookup gen time 0.000729416
> Ruby: Result: 840 Time: 0.149393345
查找生成时间是构造一个包含 1500 个元素的哈希表所花费的时间,其中键是完美的平方,值是它们各自的根。
即使在这方面,C++ 仍然比 Python 和 RubySLOWER。我意识到对于每种语言,我可能拥有总体上最有效的解决方案,但使用相同类型的操作仍然表明 C++ 非常慢。
重要编辑我将map 更改为使用unordered_map 作为C++ 解决方案,但它仍然较慢!
修改后的 C++ 文件:http://pastebin.com/2YyB6Rfm
lookup gen time: 0.00134301185608
Python Result: 840 Time: 0.280808925629
Lookup gen time 2021697 nanoseconds
C++: Result: 840 : Time: 392731891 nanoseconds
Lookup gen time 0.000729313
Ruby: Result: 840 Time: 0.148183345
【问题讨论】:
-
不,问题解决了,我在问为什么C++实现比较慢。
-
既然已经有chronos库,为什么还要使用boost/chrono库?
-
你为什么评论与我的问题无关的无用的cmets?
-
你用什么优化设置编译的?
-
@ViktorChynarov:C++ 标准库在没有优化的情况下是出了名的慢。 (就像我编写的大多数 C++ 代码一样。)
标签: python c++ ruby performance algorithm