как изменить этот код, который использует xrange для запуска в python 3? - PullRequest
2 голосов
/ 24 апреля 2020

Я читаю книгу High-Performance Python из коллекции O'Reilly, на странице № 11 я нашел этот код, который работает для python 2, смысл в том, чтобы сделать одну инструкцию, которая выполняет векторизация) несколько одновременно

import math 
def check_prime(number):
    sqrt_number = math.sqrt(number)
    number_float = float(number)
    numbers = range(2, int(sqrt_number)+1)
    for i in xrange(0, len(numbers), 5):
          # the following line is not valid Python code
          result = (number_float / numbers[i:(i+5)]).is_integer()
          if any(result):
                 return False
    return True

, но я получаю эту ошибку

TypeError: unsupported operand type(s) for /: 'float' and 'list'

Я пытался изменить ее для работы на python 3, вот моя попытка:

import math

def check_prime(number):
    sqrt_number = math.sqrt(number)
    number_float = float(number)
    numbers = list(range(2, int(sqrt_number)+1))

    for i in range(0, len(numbers), 5):
        # the following line is not valid Python code
        result = (number_float / numbers[i:(i+5)]).is_integer()
        if any(result):
            return False
    return True

Я изменил xrange для range и range(2, int(sqrt_number)+1) для list(range(2, int(sqrt_number)+1)), но мне это не удалось. Я предполагаю, что есть специальный оператор для множеств или что-то подобное, но понятия не имею. если кто-нибудь из вас может мне помочь, я буду так благодарен вам

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Я посмотрел на книгу, и эта строка не должна работать на самом деле; Вы не можете разделить на список в Python. Автор использует этот код в качестве примера того, как будет выглядеть . Комментарий # the following line is not valid Python code в оригинале указывает, что.

Наиболее близким по функциональности и семантике, вероятно, будет этот код:

import math

def check_prime(number):
    sqrt_number = math.sqrt(number)
    number_float = float(number)
    numbers = list(range(2, int(sqrt_number)+1))

    for i in range(0, len(numbers), 5):
        # the following line is now valid Python code, but not vectorized
        result = [(number_float / n).is_integer for n in numbers[i:(i+5)]]
        if any(result):
            return False
    return True

Обратите внимание, что обработка для результата в этом Версия не выполняется параллельно, поэтому, вероятно, это не то, что автор хотел продемонстрировать. Насколько я знаю, векторизация изначально недоступна в Python, вам придется использовать numpy для этого. Эта статья должна быть полезна, если вы хотите попробовать.

2 голосов
/ 24 апреля 2020

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

import math

def check_prime(number):
    sqrt_number = math.sqrt(number)
    number_float = float(number)
    numbers = list(range(2, int(sqrt_number)+1))

    for i in range(0, len(numbers), 5):
        result = [number_float % num == 0 for num in numbers[i:(i+5)]]
        if any(result):
            return False
    return True
...