ValueError: ошибка математического домена из math.log, но не могу понять ошибку - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь запустить следующий код (из Самый быстрый способ проверить, существует ли значение в списке ) по профилю вызова ():

, но, похоже, я получил этоошибка, ValueError: math domain error в то время как мой друг сказал, что он может запустить его без каких-либо проблем.Ожидаемый результат - график трех методов.

Я думаю, что проблема возникает в math.log, который может зависеть от случайного значения.

time_method_in.append(math.log(method_in(a,b,c)))
time_method_set_in.append(math.log(method_set_in(a,b,c)))
time_method_bisect.append(math.log(method_bisect(a,b,c)))

Я чувствую ошибку, потому что значениев отрицательном значении или были разделены в слишком точной точности.Итак, я пытаюсь использовать log10 и десятичное число, но ни один из этих методов, кажется, не работает.

Есть ли что-то, что я должен попробовать дальше?Большое спасибо.

import random
import bisect
import matplotlib.pyplot as plt
import math
import time

def method_in(a,b,c):
    start_time = time.time()
    for i,x in enumerate(a):
        if x in b:
            c[i] = 1
    return(time.time()-start_time)   

def method_set_in(a,b,c):
    start_time = time.time()
    s = set(b)
    for i,x in enumerate(a):
        if x in s:
            c[i] = 1
    return(time.time()-start_time)

def method_bisect(a,b,c):
    start_time = time.time()
    b.sort()
    for i,x in enumerate(a):
        index = bisect.bisect_left(b,x)
        if index < len(a):
            if x == b[index]:
                c[i] = 1
    return(time.time()-start_time)

def profile():
    time_method_in = []
    time_method_set_in = []
    time_method_bisect = []

    Nls = [x for x in range(1000,20000,1000)]
    for N in Nls:
        a = [x for x in range(0,N)]
        random.shuffle(a)
        b = [x for x in range(0,N)]
        random.shuffle(b)
        c = [0 for x in range(0,N)]

        time_method_in.append(math.log(method_in(a,b,c)))
        time_method_set_in.append(math.log(method_set_in(a,b,c)))
        time_method_bisect.append(math.log(method_bisect(a,b,c)))

    plt.plot(Nls,time_method_in,marker='o',color='r',linestyle='-',label='in')
    plt.plot(Nls,time_method_set_in,marker='o',color='b',linestyle='-',label='set')
    plt.plot(Nls,time_method_bisect,marker='o',color='g',linestyle='-',label='bisect')
    plt.xlabel('list size', fontsize=18)
    plt.ylabel('log(time)', fontsize=18)
    plt.legend(loc = 'upper left')
    plt.show()

Редактировать: Как ответил gazoh, я буду использовать его работу сейчас.Но я вернусь и обновлю его в будущем, когда у меня будет больше опыта в Python и PyPlot.Большое спасибо.

1 Ответ

0 голосов
/ 24 мая 2018

При первом вызове method_in возвращается 0.0, когда я пытался запустить ваш код, отсюда и ошибка.Вы должны реализовать способ справиться с этим делом.Кроме того, вы не можете вычислить журнал значений и использовать semilogy() в matplotlib для рисования ваших графиков в масштабе журнала:

plt.semilogy(Nls,time_method_in,marker='o',color='r',linestyle='-',label='in')
plt.semilogy(Nls,time_method_set_in,marker='o',color='b',linestyle='-',label='set')
plt.semilogy(Nls,time_method_bisect,marker='o',color='g',linestyle='-',label='bisect')
plt.xlabel('list size', fontsize=18)
plt.ylabel('time', fontsize=18)
plt.legend(loc = 'upper left')
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...