繁体   English   中英

Python递归二进制搜索功能

[英]Python recursive binary search function

问:基本上...创建一个二进制搜索算法,该语言在3种不同语言中是相同的(除了编程语言之外),对于8种不同大小的数组(128、512,...,52428,(524288) * 4)= 2097152)。 我用C和C ++编码此问题的前两种语言得到了正常结果:2097152大小的数组不超过3s

我决定尝试使用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

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

  • 使用CPython C APICython
  • 尽可能多地使用内置功能优化代码,然后将代码提供给PyPy

如果我们采用第二种方法(请注意//操作符而不是int ,用于加快列表速度的list generatorPEP8格式):

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()

毕竟,这就是我从PyPy得到的:

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

请记住,C / C ++是编译语言,而Python是一种解释语言。 Python不仅执行指令,还读取指令并将它们即时转换为可执行代码。 速度下降的另一个原因是循环结构本身。 1000的性能比率并不奇怪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM