Должен ли я использовать литералы с плавающей точкой для представления целых чисел как числа с плавающей точкой в ​​Python? - PullRequest
0 голосов
/ 02 октября 2018

Рассмотрим функцию, которая возвращает половину аргумента с плавающей точкой.Должен ли он быть первым или вторым?

def half_a(x: float) -> float:
    return x / 2

def half_b(x: float) -> float:
    return x / 2.0

Есть ли разница в производительности или существует соглашение о стиле, согласно которому один из них лучше другого?

Понятно half_a выглядит лучше, и более сложный фрагмент кода может быть написан более читабельно, но в некоторых других языках необходимо или предпочтительнее использовать версию half_b, чтобы избежать преобразования типов во время выполнения.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

float, деленное на float, немного быстрее, чем float, деленное на int:

>>> timeit.timeit('n/2', 'n=123456.789') 
0.04134701284306175
>>> timeit.timeit('n/2.0', 'n=123456.789')
0.03455621766488548
>>> timeit.timeit('[n/2 for n in r]', 'r = [n*5/1.1 for n in range(1, 10001)]', number=10000)
5.177127423787169
>>> timeit.timeit('[n/2.0 for n in r]', 'r = [n*5/1.1 for n in range(1, 10001)]', number=10000)
4.067747102254316
0 голосов
/ 02 октября 2018

Трудно понять, есть ли разница в производительности (и, если она есть, она определенно незначительна).Что касается стиля, то здесь также нет единого соглашения.Тем не менее, я бы выбрал первый, если вы используете Python 3+.В Python 3 есть другой оператор для целочисленного деления.См. Ниже

x = 2
print(type(x)) # int
print(type(x / 2)) # float
print(type(x // 2)) # int

С другой стороны, если вы находитесь на Python 2, вам, вероятно, следует выбрать второй, потому что, если ваш аргумент будет int

print(2/5) # 0
...