Python递归二进制搜索函数
问:基本上。。。为八个不同大小的阵列(128512,…,52428,(524288*4)=2097152)的相同8000000次不成功搜索创建一个相同的二进制搜索算法(编程语言除外)。 前两种语言是C和C++,得到了正常的结果:对于2097152个大小的数组不超过3s。 我决定试试Python,因为我从未编写过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
-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