Почему я получаю ошибку памяти в python для этой программы? - PullRequest
0 голосов
/ 30 января 2019

Я новичок в python и работаю над проектом программирования для начинающих, где я хочу:

Оценить количество калорий в одной кубической миле шоколадного мороженого.Примечание: в миле 5280 футов, а в одном кубическом футе шоколадного мороженого содержится около 48 600 калорий.

Мой код:

Onemile = 5280
cubicmile = 5280**3
calories = 48,600
print("Number of calories per cubic mile:",cubicmile*calories)

Вывод:

Traceback (most recent call last):

  File "<ipython-input-100-90c2410fa01f>", line 4, in <module>
    print("Number of calories per cubic mile:",cubicmile*calories)

MemoryError

Почему это происходит?Есть ли проблема с тем, как я формулирую уравнение?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Как уже отмечалось, проблема в строке calories = 48,600.

Проблема в том, что из-за , на правой стороне, это то же самое, что и calories = (48, 600), то есть tuple.А для кортежей умножение означает «повторить кортеж n раз».Например, 2 * (48, 600) == (48, 600, 48, 600).

Но так как вы делаете 5280**3 * calories, это пытается выделить кортеж с элементами 2 * 5280**3 = 294395904000, который кажется слишком большим, чтобы поместиться в вашей памяти (при условии 64 бит на значение,это будет 2,14 ТиБ, что больше, чем у большинства народов).

Обратите внимание, что в Python 3.6 + вы можете использовать _ в качестве разделителя для тысяч:

calories = 48_600
0 голосов
/ 30 января 2019

Вы пытаетесь напечатать кортеж (48, 600) (это то, что вы получаете, когда пишете calories = 48,600) 147197952000 раз.

Ваш вывод будет быть:

Number of calories per cubic mile: (48, 600, 48, 600, 48, 600, ... , 48, 600)

Ваш компьютер просто не может справиться ок.1324781568000 символов, которые вы хотите вывести сразу.

Вместо использования , в качестве разделителя тысяч, вы должны просто написать 48600.

Onemile = 5280
cubicmile = 5280**3
calories = 48600
print("Number of calories per cubic mile:",cubicmile*calories)

Вывод:

Number of calories per cubic mile: 7153820467200000

Редактировать:

На самом деле, это не печать или создание такой большой строки, которая терпит неудачу, потому что кажется - по крайней мере для меня - что Python будетНедостаточно памяти при попытке создать 147197952000 указатели на кортеж, которые вы можете проверить, выполнив только (48,600) * 147197952000.

...