Поиск ошибки в программе «Собачьи годы - человеческие годы» - PullRequest
1 голос
/ 21 июня 2020

Я новичок в python.

  1. Если ввод 5, как мне сделать вывод 33 напечатанным только один раз?

  2. Самый главный вопрос: есть ли алгоритм для замены необходимости писать 21?

Вот исходный вопрос:

Обычно сказал, что один человеческий год эквивалентен 7 собачьим годам. Некоторые люди считают, что лучше считать каждый из первых двух человеческих лет как 10,5 собачьих лет, а затем считать каждый дополнительный человеческий год как 4 собачьих года

dog_years=int(input("Enter the age of the dog to get it's equivalent for it's owner:" ))
dog_age_to_human_age_1=10.5*dog_years
dog_age_to_human_age_2=4*(dog_years-2)
dog_1=[]

if dog_years <= 0:
    print("Please Enter an positive integer whole number")
    exit()
elif dog_years > 0 and  dog_years <= 2:
    print(dog_age_to_human_age_1)
    dog_1.append(dog_age_to_human_age_1)


for dog_years in range(3,dog_years+1):
    dog_1.append(dog_age_to_human_age_2)
    print(dog_1[-1]+21)               #is there an algorithm to replace the 21?

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Я немного переписал ваш код, чтобы получить необходимую функциональность:

# 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.")  

Вы можете заменить for-l oop на NumPy вот так:

arr = np.ones(dog_years)
arr[:2] *= young_year
arr[2:] *= old_year
human_age = np.sum(arr)

Эту задачу можно было бы более элегантно решить арифметически:

# 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 голосов
/ 21 июня 2020

Производительность различных методов преобразования

Проверены следующие методы

  1. Арифметика c - Сложность O (1)
  2. Для L oop - - сложность O (n), где n год
  3. Numpy - сложность O (n), где n год
  4. Генератор - сложность O (n), где n - год

Результаты

Тест 1: разная длина списка возрастов со случайным возрастом от 0 до 25

  • Лучшая производительность с использованием арифметики c
  • Для l oop и аналогичного генератора
  • Numpy худшая производительность

Тест 2: Различный возраст от 0 до 2 ** 10 (хотя возраст старше 25 лет нереалистичен c для собак)

  • Арифмети c лучший исполнитель в любом возрасте
  • Для l oop лучше, чем генератор для возраста менее 20
  • Для l oop лучше, чем для генератора старше 20
  • Numpy лучше, чем для l oop и генератора старше 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

Тест 1: случайный возраст от 0 до 25, различное количество возрастов

# 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
    )

Выход

Performance Comparision

Test 2: Varying Age from 0 to 1024 in Years

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
    )

Output введите описание изображения здесь

...