Har*_*ber 7 ruby string performance
我为Project Euler编写了以下方法- 问题36.它所做的就是将基数10和基数2中所有小于1,000,000的数字加起来作为回文.
def problem_36
(1...1_000_000).select do |n|
n.to_s == n.to_s.reverse && n.to_s(2) == n.to_s(2).reverse
end
end
Run Code Online (Sandbox Code Playgroud)
现在,这可以工作,并在1秒钟内给出正确的结果.我希望在1秒内得到它,所以我决定减少将数字转换为字符串的次数.所以我做了以下更改:
def problem_36
(1...1_000_000).select do |n|
base10 = n.to_s
base2 = n.to_s(2)
base10 == base10.reverse && base2 == base2.reverse
end
end
Run Code Online (Sandbox Code Playgroud)
问题是,这个版本实际上比原版慢了约50%.所以问题是:分配这两个变量真的很慢吗?或者是Ruby优化链式方法调用?
在这一行
n.to_s == n.to_s.reverse && n.to_s(2) == n.to_s(2).reverse
Run Code Online (Sandbox Code Playgroud)
如果第一部分是false
(Ruby的&&
运算符短路,与其&
对应部分不同),则不执行第二部分.这节省了很多电话to_s(2)
.
归档时间: |
|
查看次数: |
228 次 |
最近记录: |