- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在学习了迭代器类方法和生成器之后,我测试了使用每个习语的简单 Fizz Buzz 解决方案的性能特征:
>>> from timeit import timeit
>>> timeit('tuple(fizzbuzz.FizzBuzzIterator(10))', 'import fizzbuzz')
13.281935930252075
>>> timeit('tuple(fizzbuzz.fizz_buzz_generator(10))', 'import fizzbuzz')
7.619534015655518
根据 timeit
,生成器函数比迭代器类快 1¾ 倍。
我的问题又来了:为什么这个 Fizz Buzz 生成器比这个 Fizz Buzz Iterator 类快得多?
class FizzBuzzIterator:
def __init__(self, low, high=None):
if high is None:
self.high = low
self.current = 1
else:
self.high = high
self.current = max(low, 1)
def __iter__(self):
return self
def next(self):
if self.current > self.high:
raise StopIteration
else:
c = self.current
self.current += 1
if (c % 5 + c % 3) == 0:
return 'FizzBuzz'
elif c % 5 == 0:
return 'Buzz'
elif c % 3 == 0:
return 'Fizz'
else:
return str(c)
def fizz_buzz_generator(low, high=None):
if high is None:
high = low
cur = 1
else:
cur = max(low, 1)
while cur <= high:
c = cur
cur += 1
if (c % 5 + c % 3) == 0:
yield 'FizzBuzz'
elif c % 5 == 0:
yield 'Buzz'
elif c % 3 == 0:
yield 'Fizz'
else:
yield str(c)
最佳答案
因为显然,生成器的实现比迭代器更有效。
您的第一个解决方案具有以下有趣的特征:
第二种解决方案不执行任何这些操作,而是 yield
,这意味着语言运行时会执行繁重的工作。由于运行时通常用 C 语言实现,因此这比您的第一个解决方案的非常高级的代码优化得多。
接下来,您应该考虑您实际进行基准测试的内容。为了获得良好的基准,您应该选择不同的输入大小 n 并观察两种解决方案在不同规模下的比较情况。
关于python - 为什么这个 Fizz Buzz 生成器比这个 Fizz Buzz Iterator 类快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21650038/
https://leetcode.com/problems/fizz-buzz/open in new window Total Accepted: 31093 Total Submiss
在学习了迭代器类方法和生成器之后,我测试了使用每个习语的简单 Fizz Buzz 解决方案的性能特征: >>> from timeit import timeit >>> timeit('tuple(
我正在创建一个基于 Fizz Buzz 序列的测验,用户需要猜测该系列中的最后一个元素。 示例:422、嘶嘶声、424、嗡嗡声、? 可能的答案应该是: 嘶嘶声 嗡嗡声 嘶嘶声 整数 这就是我卡住的地方
1.题目 给你一个整数 n ,找出从 1 到 n 各个整数的 Fizz Buzz 表示,并用字符串数组 answer(下标从 1 开始)返回结果,其中: answer[i] == “FizzBuzz”
为什么这会导致 1 2 Fizz 3 ?它不应该导致 1 2 Fizz 吗?!我对这个循环的输出有点困惑..?添加 else if 可以解决这个问题,我的问题是为什么? for (int i = 1;
我正在努力学习Java。有一天,我看到一个网站提供在线解决挑战的方法。这是我选择的代码项目:Fizz Buzz 这就是我的项目: import java.io.BufferedReader; impo
出于教育目的,我正在使用多线程实现经典的“嘶嘶声”问题。 “嘶嘶声”游戏是: The player designated to go first says the number "1", and ea
我的任务是用 Javascript 做 FizzBuzz 游戏。问题是我的循环在第一次迭代后停止,只返回第一个值 (4)。我可能对我的代码视而不见,但我找不到错误在哪里。如果你可以的话,请将我推向
我们今天讨论了“fizz buzz”编程测试,我考虑过用 C++ 实现它,但使用元编程。理想情况下,它会在编译期间生成输出。 我当前的代码使用模板,但仍必须执行它才能生成输出。在 Ideone 上查看
我刚刚做了 fizz buzz 测试,但我做的与下面的答案不同。我将第一个“if”语句(即 i%3===0 && i%5===0)作为最后一个“else if”语句,但出于某种原因它没有不工作。但是我
我的任务是用 Javascript 做 FizzBuzz 游戏。问题是当我运行该函数时,我得到“Answer = undefined”。我必须用逗号分隔值来打印它,但我想我可以自己弄清楚;提前致谢
剧透警告:我是一个真正的新手。负责找出嘶嘶声ruby 用于一个类,虽然我发现了多个版本的代码解决问题,我的理解是如此简陋,以至于我不能弄清楚这些例子是如何真正起作用的。 第一个问题(如果你笑出声请引用
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
我听说这是一个常见的面试问题,请问这里有什么问题,谢谢。 for(i in 1:100){ if(i%15==0){ print('fizzbuzz') } else if
我对这段代码有些失望。我可能看不到它。我不断收到“意外 token ”或“非法”错误(考虑到我以前从未见过这样的错误,后者完全让我感到困惑。 我一直在仔细检查语法,我想这可能是我没有捕捉到的东西? f
为了清除我在 python 中的 lambda、map 和 list 的概念,我正在尝试实现 this solution仅在一行中使用 lambda 而不是将函数“rs”作为参数传递给 map 函数,
我正在尝试使用 go lang 中的 map 来实现 fizz buzz 问题。但是,此代码需要改进其工作方式。由于遍历 map 的 for 循环,它不断打印不需要的和冗余的结果。我尝试了很多解决方案
我是一名优秀的程序员,十分优秀!