Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python递归二进制搜索函数_Python_Algorithm_Search_Binary_Analysis - Fatal编程技术网

Python递归二进制搜索函数

Python递归二进制搜索函数,python,algorithm,search,binary,analysis,Python,Algorithm,Search,Binary,Analysis,问:基本上。。。为八个不同大小的阵列(128512,…,52428,(524288*4)=2097152)的相同8000000次不成功搜索创建一个相同的二进制搜索算法(编程语言除外)。 前两种语言是C和C++,得到了正常的结果:对于2097152个大小的数组不超过3s。 我决定试试Python,因为我从未编写过Python,所以想尝试一下。我最终得到了算法完成的荒谬时间: -For 128 elements I got 800s -512 elements = 1005s -2048 eleme

问:基本上。。。为八个不同大小的阵列(128512,…,52428,(524288*4)=2097152)的相同8000000次不成功搜索创建一个相同的二进制搜索算法(编程语言除外)。 前两种语言是C和C++,得到了正常的结果:对于2097152个大小的数组

不超过3s。 我决定试试Python,因为我从未编写过Python,所以想尝试一下。我最终得到了算法完成的荒谬时间:

-For 128 elements I got 800s
-512 elements = 1005s
-2048 elements = 1682s
-8192 elements = 4152s (my computer went to sleep so this may be the sudden increase)
-32768 elements = 1714s
-131072 elements = 1890s
-524288 = 2074s
-2097152 = still running!!
(除了包含8192个元素的数组之外,这基本上遵循O(log(base2)n):平均每个递归检查需要114秒

这是我第一次用Python编写代码,所以我想知道:我的代码是否效率很低(即使算法非常基本),或者Python是否不能处理递归调用以及C/C++/Java,尤其是当它们变得非常大时?任何帮助/见解都会很好。我的Python代码如下:

import time
def binarySearch(array, key, min, max):
    mid = int(min + ((max - min) / 2))
    if min >= max:
        return False
    elif array[mid] == key:
        return True
    elif array[mid] > key:
        return binarySearch(array, key, min, mid - 1)
    elif array[mid] < key:
        return binarySearch(array, key, mid + 1, max)

i = 128
#for i in range(128, 2097152):
while i <= 2097152:
    sTime = time.time()
    myArray = [None] * (i-1)
    for k in range(0, i-1):
        myArray[k] = 13
    eTime = time.time()
    k = 0
    startTime = time.time()
    for k in range(0, 8000000):
        binarySearch(myArray, 100, 0, i-1)
    endTime = time.time()
    print("[Size = ", i, "] 8,000,000 Unsucessful Searches took ", endTime - startTime, " seconds\n")
    i = i*4
导入时间
def二进制搜索(数组、键、最小值、最大值):
mid=int(最小值+(最大值-最小值)/2)
如果最小值>=最大值:
返回错误
elif数组[mid]==键:
返回真值
elif数组[mid]>键:
返回二进制搜索(数组、键、最小值、中间值-1)
elif数组[mid]<键:
返回二进制搜索(数组、键、mid+1、最大值)
i=128
#对于范围内的i(1282097152):

虽然有两种方法可以解决Python的性能问题:

  • 使用
    C
    pythoncapi
    Cython
  • 使用尽可能多的内置功能优化代码,然后将代码提供给
    PyPy
如果我们采用第二种方法(请注意
/
运算符而不是
int
列表生成器
用于加速列表和格式化):


请记住,C/C++是编译语言,Python是解释语言。Python不仅执行指令,还动态读取指令并将其转换为可执行代码。另一个导致速度减慢的原因是循环构造本身。1000的性能比并不奇怪。

3s对于C/C++来说,二进制代码也太多了搜索2*10^6大小的数组。理想情况下,搜索时间应该不到半秒。这是python2.x吗?范围内k(080000)
将是一个非常昂贵的调用——如果使用
xrange
会发生什么?哦……您也在进行8e6搜索。(我没有看到这部分)。那么就可以了。而且您的算法实现没有问题。
mid=(min+max)/2
,也不要一直查找中值
数组[mid]我只需要解释我在C、C++和Python之间的时间差异。我应该注意到Python是一个解释的,执行指令,并且也读它们并把它们翻译成可执行代码。
import time


def binary_search(array, key, min_, max_):
    mid = min_ + ((max_ - min_) // 2)
    if min_ >= max_:
        return False
    elif array[mid] == key:
        return True
    elif array[mid] > key:
        return binary_search(array, key, min_, mid - 1)
    elif array[mid] < key:
        return binary_search(array, key, mid + 1, max_)

i = 128
magic = 13
my_array = [magic for _ in range(i-1)]
while i <= 2097152:
    k = 0
    start_time = time.time()
    for k in range(0, 8000000):
        binary_search(my_array, 100, 0, i-1)
    end_time = time.time()
    print("[Size = ", i, "] 8,000,000 Unsucessful Searches took ", end_time - start_time, " seconds\n")

    s_time = time.time()
    my_array += [magic for _ in range(3 * i)]
    i = i*4
    e_time = time.time()
D:\>pypy test.py
[Size =  128 ] 8,000,000 Unsucessful Searches took  0.1699998378753662  seconds
[Size =  512 ] 8,000,000 Unsucessful Searches took  0.9229998588562012  seconds
[Size =  2048 ] 8,000,000 Unsucessful Searches took  1.0799999237060547  seconds
[Size =  8192 ] 8,000,000 Unsucessful Searches took  1.2969999313354492  seconds
[Size =  32768 ] 8,000,000 Unsucessful Searches took  1.5120000839233398  seconds
[Size =  131072 ] 8,000,000 Unsucessful Searches took  1.7920000553131104  seconds
[Size =  524288 ] 8,000,000 Unsucessful Searches took  2.062000036239624  seconds
[Size =  2097152 ] 8,000,000 Unsucessful Searches took  2.236999988555908  seconds