5 Вопрос: Преобразовать целое число в число с плавающей точкой

вопрос создан в Wed, May 8, 2019 12:00 AM

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

Я определил следующую функцию:

def if_int_to_float(value):

    if isinstance(value, bool):

        return value

    elif isinstance(value, int):

        return float(value)

    else:

        return value

При широком использовании я обнаружил, что эта функция немного медленная. Любая идея улучшить его производительность /сделать его более питоническим?

    
0
  1. Что вы имеете в виду, когда говорите медленно?
    2019-05-08 15: 52: 25Z
  2. Вопрос: зачем вам эта функция вообще нужна? Это похоже на то, где, если вам нужен float, вы можете просто привести его к float(), когда это необходимо.
    2019-05-08 15: 53: 20Z
  3. Вы проверяете bool, но ничего особенного в этом не делаете, поэтому можете его удалить.
    2019-05-08 15: 55: 35Z
  4. Этот код запускается как часть более крупной программы, и после игры с cProfile я вижу, что значительная часть времени выполнения израсходована этим вызовом функции даже хотя это не называется слишком много.
    2019-05-08 18: 19: 46Z
5 ответов                              5                         

Возможно, вы можете объединить ваши условия if. Это поможет, поскольку мы закорачиваем условия if на основе входных данных, что может ускорить ваш код!

def if_int_to_float(value):

    #If not boolean and int or float, convert to float
    if not isinstance(value, bool) and isinstance(value, int) or isinstance(value,float):
        return float(value)

    #Else return value
    else:
        return value

print(if_int_to_float('a'))
print(if_int_to_float(1))
print(if_int_to_float(1.0))
print(if_int_to_float(True))

Вывод будет

a
1.0
1.0
True
    
1
2019-05-08 16: 38: 49Z
  1. Это работает, спасибо, но решение Fuzzbury быстрее!
    2019-05-08 18: 24: 40Z
  2. Конечно, могу я узнать, как вы оценили его как более быстрый? Также использование типа является плохим, и даже документы предлагают использовать isinstance
    2019-05-09 02: 19: 30Z
  3. Спасибо, Девеш, просто запустил cProfile для моего кода с новой функцией. Однако после прочтения более подробной информации о type я выбрал ваше решение.
    2019-05-09 06: 28: 01Z
  4. Конечно, спасибо, ранее выбранное решение использовало ненужное умножение в коде, тогда как достаточно просто цепочки ifinstance:)
    2019-05-09 06: 29: 27Z

Вы можете убрать одну проверку и написать в одной строке, чтобы получить небольшое улучшение скорости при передаче чисел с плавающей запятой или строк. Случай bool уже очень быстрый.

Isinstance () вызывает у вас некоторые проблемы, поскольку bool также соответствует int, следовательно, ваш первый оператор if, так что вы можете использовать вместо него type ()

def if_int_to_float(value):
    return value * 1.0 if type(value) == int else value
    
3
2019-05-08 16: 07: 00Z
  1. Это работает как талисман и ускоряет мой код. Спасибо!
    2019-05-08 18: 21: 26Z
  2. Если бы я мог спросить, откуда вы знаете @NicolasBerthier, что это быстрее? Также использование type - это плохо, и вы всегда должны использовать isinstance для проверки типов в соответствии с документами python: docs.python.org/3/library/functions.html#type
    2019-05-09 05: 24: 14Z
  3. Привет, Девеш, просто выполнив мой код через cProfile и заменив функцию.
    2019-05-09 06: 28: 42Z

попробуйте это

def if_int_to_float(value):

    if type(value) == int:

        return float(value)

    else:

        return value
    
2
2019-05-08 16: 01: 57Z
  1. Это работает, спасибо, но решение Fuzzbury быстрее!
    2019-05-08 18: 23: 14Z

Может быть, вы можете попробовать функцию type() и получить результат. Или вы можете использовать обработку исключений для решения этого типа проблемы. Но в этом случае, как указано в комментариях, в случае значений bool будет преобразовано True в 1.0 и False в 0.0.

#using type() function
def if_int_to_float(value):
    if type(value) == int:
        return float(value)
    else:
        return value
    
1
2019-05-08 16: 02: 11Z
  1. Это преобразует логическое значение в 1.0!
    2019-05-08 16: 01: 55Z
  2. спасибо за указание на это.
    2019-05-08 16: 02: 45Z

когда данные находятся в списке, используйте lambda

data=[1,3,'j','oo']
sol = list(map(lambda x: float(x) if type(x)=='int' else x, data))
print(sol)

вывод

[1.0, 3.0, 'j', 'oo']

или используйте функцию для проверки отдельного значения

def fun_int_to_float(value):
    if type(value)=='int':
        return float(value)
    return value
    
1
2019-05-08 16: 05: 14Z
  1. Спасибо за решение. Моих данных нет в списке, но я буду хранить их, если они мне понадобятся.
    2019-05-08 18: 24: 09Z
источник размещен Вот