【问题标题】:how to change this code that use xrange to run in python 3?如何更改使用 xrange 在 python 3 中运行的代码?
【发布时间】:2020-08-08 04:32:25
【问题描述】:

我正在阅读 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 更改为range,将range(2, int(sqrt_number)+1) 更改为list(range(2, int(sqrt_number)+1)),但我没有成功。我想有一个特殊的集合或类似的运算符,但不知道。如果你们中的任何人可以帮助我,我会非常感激你

【问题讨论】:

    标签: python-3.x python-2.x


    【解决方案1】:

    我看了这本书,那条线不应该按原样工作;你不能除以 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 来做到这一点。 This article 应该很有用,如果你想试试的话。

    【讨论】:

    • 感谢 srry 的非阅读偏见,接下来我会更加小心
    • 别太担心,它会发生的。而且我们倾向于期望编程书中的代码是有效的
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 2015-03-01
      • 2022-06-17
      • 2019-08-04
      • 2020-11-15
      • 1970-01-01
      相关资源
      最近更新 更多