2012-07-12 46 views
7

Tôi muốn kiểm tra hiệu suất của một số mã sử dụng giá trị gia tăng theo cấp số nhân. Vì vậy, đó là một chữ số bổ sung được thêm vào các số_size các increment được nhân với 10. Đây là cách tôi đang làm nó cho đến nay nhưng có vẻ hơi hacky. Đề xuất cải tiến mà không giới thiệu các thư viện không chuẩn?Cách tạo phạm vi tăng theo cấp số nhân trong Python

numbers_size = 100 
increment = 100 
numbers_range = 1000000000 
while numbers_size < numbers_range: 
    t = time.time() 
    test(numbers_size) 
    taken_t = time.time() - t 
    print numbers_size, test, taken_t 

    increment = 10 ** (len(str(numbers_size))-1) 
    numbers_size += increment 
+0

Bạn có câu trả lời, nhưng tôi có thể hỏi tại sao không? –

+0

Để xem sự khác biệt của danh sách tìm kiếm và từ điển cho một cuộc nói chuyện tôi đang đưa ra về các mẹo hiệu suất Python. – Martlark

Trả lời

7

Để tạo các số giống với mã của bạn:

numbers_sizes = (i*10**exp for exp in range(2, 9) for i in range(1, 10)) 
for n in numbers_sizes: 
    test(n) 
-1

ví dụ về 'KHÔNG đọc những câu hỏi đúng' và 'KHÔNG làm thế nào để làm điều đó'

for i in xrange(100, 1000000000, 100): 
    # timer 
    test(i) 
    # whatever 

là về đơn giản như nó được ... điều chỉnh xrange phù

+0

điều này đã được downvoted (mặc dù không phải của tôi) có lẽ vì phạm vi của bạn là tuyến tính, không phải theo cấp số mũ. – msw

+0

@msw Điểm công bằng và được thực hiện tốt - cảm ơn bạn, tôi sẽ bỏ qua lỗi của tôi (** đọc câu hỏi đúng ** và ** không phải cách thực hiện **) mặc dù vẫn ở trong cộng đồng cho mục đích tham khảo . –

+0

Tôi serially upvoted một số câu trả lời cũ của bạn mà tôi nghĩ rằng nó vì hai lý do: chủ yếu là tôi ghét "drive-by" downvoters người không bận tâm giải thích và tôi đánh giá cao những người mới tham gia đóng góp. Tại sao OP lại làm điều đó một cách thực sự khó khăn, tôi chia sẻ sự bối rối của bạn nhưng tôi không mong đợi chúng ta sẽ nghe lại điều đó. – msw

3

Điều đơn giản nhất là sử dụng chuỗi số mũ tuyến tính:

for e in range(1, 90): 
    i = int(10**(e/10.0)) 
    test(i) 

Bạn có thể trừu tượng chuỗi thành máy phát điện riêng của mình:

def exponent_range(max, nsteps): 
    max_e = math.log10(max) 
    for e in xrange(1, nsteps+1): 
     yield int(10**(e*max_e/nsteps)) 

for i in exponent_range(10**9, nsteps=100): 
    test(i) 
12

Tại sao không

for exponent in range(2, 10): 
    test(10 ** exponent) 

nếu tôi đọc đúng ý định của bạn.

0

Sử dụng một biểu thức máy phát điện:

max_exponent = 100 
for i in (10**n for n in xrange(1, max_exponent)): 
    test(i) 
3

Tôi thích câu trả lời Ned Batcheldor, nhưng tôi sẽ làm cho nó tổng quát hơn một chút:

def exp_range(start, end, mul): 
    while start < end: 
     yield start 
     start *= mul 

sau đó mã của bạn trở nên

for sz in exp_range(100, 1000000000, 10): 
    t = time.time() 
    test(sz) 
    print sz, test(sz), time.time()-t 
7

Nếu bạn coi như là một trong những tiêu chuẩn;), bạn có thể sử dụng numpy.logspace vì đó chính xác là những gì nó phải làm .... (lưu ý: 100 = 10^2, 1000000000 = 10^9)

for n in numpy.logspace(2,9,num=9-2, endpoint=False): 
    test(n) 

ví dụ 2 (lưu ý: 100 = 10^2, 1000000000 = 10^9, muốn đi vào một bước 10x, nó là 9-2 + 1 điểm ...):

In[14]: np.logspace(2,9,num=9-2+1,base=10,dtype='int') 
Out[14]: 
array([  100,  1000,  10000,  100000, 1000000, 
     10000000, 100000000, 1000000000]) 

ví dụ 3:

In[10]: np.logspace(2,9,dtype='int') 
Out[10]: 
array([  100,  138,  193,  268,  372, 
       517,  719,  1000,  1389,  1930, 
      2682,  3727,  5179,  7196,  10000, 
      13894,  19306,  26826,  37275,  51794, 
      71968,  100000,  138949,  193069,  268269, 
      372759,  517947,  719685, 1000000, 1389495, 
      1930697, 2682695, 3727593, 5179474, 7196856, 
     10000000, 13894954, 19306977, 26826957, 37275937, 
     51794746, 71968567, 100000000, 138949549, 193069772, 
     268269579, 372759372, 517947467, 719685673, 1000000000]) 

về trường hợp của bạn, chúng tôi sử dụng endpoint=False vì bạn không muốn bao gồm điểm cuối ... (ví dụ: np.logspace(2,9,num=9-2, endpoint=False))

Các vấn đề liên quan