Python 在我的狗年到人类年计划中发现错误
我是python的初学者Python 在我的狗年到人类年计划中发现错误,python,python-3.x,for-loop,while-loop,Python,Python 3.x,For Loop,While Loop,我是python的初学者 如果输入为5,如何使输出33仅打印一次 最重要的问题是:是否有一种算法可以取代写21的需要 原来的问题是: 人们常说,一个人的年等于7个狗年。有些人认为,最好先把前两个人的年都算作10.5个狗年,然后再把每增加一个人的年算作4个狗年 dog_years=int(输入(“输入狗的年龄以获得其主人的等价物:”) 狗的年龄到人的年龄=10.5*狗的年龄 狗的年龄到人的年龄=4*(狗的年龄-2岁) 狗_1=[] 如果dog_years 0和dog_years我稍微重写了您的
dog_years=int(输入(“输入狗的年龄以获得其主人的等价物:”)
狗的年龄到人的年龄=10.5*狗的年龄
狗的年龄到人的年龄=4*(狗的年龄-2岁)
狗_1=[]
如果dog_years 0和dog_years我稍微重写了您的代码,以获得我理解的所需功能:
# Algorithmic solution
dog_years = int(input("Enter the age of the dog to get it's equivalent for it's owner:" ))
young_year = 10.5
old_year = 4
human_age = 0
if dog_years < 0:
print("Please Enter a positive integer whole number")
else:
for i in range(dog_years):
if i < 2:
human_age += young_year
else:
human_age += old_year
print(f"Your dog is {human_age} human years old.")
这个问题可以更优雅地用算术来解决:
# Arithmetic solution
if dog_years < 0:
print("Please Enter a positive integer whole number")
elif dog_years <= 2:
human_age = dog_years * young_year
else:
human_age = 2 * young_year + (dog_years - 2) * old_year
#算术解
如果狗年<0:
打印(“请输入一个正整数”)
elif狗年不同转换技术的性能
检查了以下方法
算术——O(1)复杂度
For Loop--O(n)复杂度,其中n是年份
Numpy--O(n)复杂性,其中n是年份
生成器——O(n)复杂性,其中n是年份
结果
# Time using perfplot (https://pypi.org/project/perfplot/)
perfplot.show(
setup=lambda n: [randint(0, 25) for _ in range(n)], # or simply setup=numpy.random.rand
kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
n_range=[2 ** k for k in range(17)],
xlabel="List Length",
equality_check= None,
target_time_per_measurement=1.0
)
perfplot.show(
setup=lambda n: [n], # or simply setup=numpy.random.rand
kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
n_range=[2 ** k for k in range(10)],
xlabel="Years",
equality_check= None,
target_time_per_measurement=1.0
)
测试1:不同长度的年龄列表,随机年龄介于0到25岁之间
- 使用算术的最佳性能
- 对于回路和发电机类似
- 最糟糕的表现
测试2:从0到2**10的不同年龄段(尽管对于狗来说,25岁以上的年龄是不现实的)
- 算术是所有年龄段中表现最好的
- 对于小于20岁的年龄,回路优于发电机
- 对于高于20的回路,其性能优于发电机
- Numpy优于100岁以上的回路和发电机,但在其他方面最差
代码
import numpy as np
from random import randint
import perfplot
def test_arithmetic(test_years):
" Arithmetic method test "
def calc_arithmetic(dog_years):
" arithmetic conversion O(1) complexity "
return young_year*dog_years if dog_years <= 2 else 2*young_year + (dog_years-2)*old_year
for years in test_years:
" Perform over the designated years "
calc_arithmetic(years)
def test_for_loop(test_years):
" For loop test runs "
def calc_for_loop(dog_years):
human_age = 0
for i in range(dog_years):
if i < 2:
human_age += young_year
else:
human_age += old_year
return human_age
for years in test_years:
" Perform over the designated years "
calc_for_loop(years)
def test_np(test_years):
" Numpy method test runs "
def calc_np(years):
" convert using numpy "
arr = np.ones(years)
arr[:2] *= young_year
arr[2:] *= old_year
return np.sum(arr)
for years in test_years:
" Perform over the designated years "
calc_np(years)
def test_generator(test_years):
def calc_list(years):
" convert using generator "
return sum(young_year if i < 2 else old_year for i in range(years))
for years in test_years:
" Perform over the designated years "
calc_list(years)
young_year = 10.5
old_year = 4
输出
测试2:年龄从0岁到1024岁不等
# Time using perfplot (https://pypi.org/project/perfplot/)
perfplot.show(
setup=lambda n: [randint(0, 25) for _ in range(n)], # or simply setup=numpy.random.rand
kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
n_range=[2 ** k for k in range(17)],
xlabel="List Length",
equality_check= None,
target_time_per_measurement=1.0
)
perfplot.show(
setup=lambda n: [n], # or simply setup=numpy.random.rand
kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
n_range=[2 ** k for k in range(10)],
xlabel="Years",
equality_check= None,
target_time_per_measurement=1.0
)
输出
编辑您的问题标题以应用于该问题。对不起,不清楚您在问什么,能否提供示例和预期输出。for循环中有一条打印语句。这就是你多次指出的原因。“你可能很想了解更多关于NumPy的信息”--对这个简单的问题和初级的编码体验好奇为什么?我添加了一个NumPy解决方案和一个算术解决方案。由于OP正在学习python,我认为numpy中的解决方案对他来说会很有趣。但我可能只是因为我对numpy的偏爱才这么认为。如果你认为这对我的回答没有帮助,我很乐意删除它。@Benji——事实上,我唯一的观点是,作为初学者,在尝试更高级的Python模块(如numpy)之前,他应该对基础知识有很好的理解。调查问卷询问“是否有一种算法来代替21”。我认为你的算术解是他们for-loop解的一个更聪明的实现。然而,我认为您的算术解决方案甚至更好,因为它更快(即常数时间),更简单,并且只使用Python初学者应该知道的东西。总的来说,我会保留这两种解决方案,以便向用户演示。@Benji--FYI--作为另一种解决方案,在性能计时测试方面,显示以下简单Python循环的运行速度比Numpy代码快几倍:sum(如果我<2岁,年轻一岁;如果我在范围内,老年一岁(狗年))
@DarryIG感谢您分享这个简洁明了的解决方案!关于绩效,您是否有具体的参考资料?我刚刚做了一个计时测试,python对于小于~100的值速度更快,但从~1000 numpy开始,它的性能远远优于python。所以,考虑到这个将狗的年龄变成人类年龄的特殊用例,我承认你是对的。@DarryIG这是运行时行为的一个很好的比较!非常感谢。测试2完美地展示了我在写其他评论时所考虑的内容。然而,我想指出,测试1有一个相当明显的结果,因为每个测试函数都只是一个调用常量时间函数的for循环,所以由于python的for循环,运行时间的增加是线性的。如果用NumPy功能替换for循环调用calc\u np(years)
,NumPy的美妙之处将胜过普通Python。@Benji——对于测试1——随机年龄在0-25岁之间,平均值为12.5,因此您希望平均有这么多for循环。在这个水平上,Numpy是最差的,如测试2所示。Numpy的有趣之处在于性能相对平稳(只是缓慢增加)。这指出了一些固定的开销,这使得它只适用于较大的问题规模(即在这种情况下,循环超过100次)。这就是您在Numpy中经常看到的情况——对于更大的问题,它通常只比纯Python好。因此,除非您正在进行复杂的计算,否则纯Python通常会更好。