如何改变这段使用xrange的代码在python 3中运行?

问题描述 投票:0回答:1

我在看O'Reilly收集的高性能Python书,在第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 对于 rangerange(2, int(sqrt_number)+1) 对于 list(range(2, int(sqrt_number)+1)) 但我没有成功地在这。我想有一个特殊的操作集或类似的东西,但没有想法。

python-3.x python-2.x
1个回答
2
投票

我看了一下书上的内容,那行代码其实不应该按原样工作,在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
投票

试试这个。

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
© www.soinside.com 2019 - 2024. All rights reserved.