第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Numba @jit(nopython=True) 函數(shù)對(duì)繁重的 Numpy 函數(shù)沒(méi)有提供速度提升

Numba @jit(nopython=True) 函數(shù)對(duì)繁重的 Numpy 函數(shù)沒(méi)有提供速度提升

www說(shuō) 2021-11-09 15:19:48
我目前正在運(yùn)行test_matrix_speed()以查看我的search_and_book_availability功能有多快。使用 PyCharm 分析器,我可以看到每個(gè)search_and_book_availability函數(shù)調(diào)用的平均速度為 0.001 毫秒。擁有 Numba@jit(nopython=True)裝飾器對(duì)該函數(shù)的性能沒(méi)有影響。這是因?yàn)闆](méi)有任何改進(jìn)并且 Numpy 在這里運(yùn)行得盡可能快嗎?(我不在乎generate_searches函數(shù)的速度)這是我正在運(yùn)行的代碼import randomimport numpy as npfrom numba import jitdef generate_searches(number, sim_start, sim_end):    searches = []    for i in range(number):        start_slot = random.randint(sim_start, sim_end - 1)        end_slot = random.randint(start_slot + 1, sim_end)        searches.append((start_slot, end_slot))    return searches@jit(nopython=True)def search_and_book_availability(matrix, search_start, search_end):    search_slice = matrix[:, search_start:search_end]    output = np.where(np.sum(search_slice, axis=1) == 0)[0]    number_of_bookable_vecs = output.size    if number_of_bookable_vecs > 0:        if number_of_bookable_vecs == 1:            id_to_book = output[0]        else:            id_to_book = np.random.choice(output)        matrix[id_to_book, search_start:search_end] = 1        return True    else:        return Falsedef test_matrix_speed():    shape = (10, 1440)    matrix = np.zeros(shape)    sim_start = 0    sim_end = 1440    searches = generate_searches(1000000, sim_start, sim_end)    for i in searches:        search_start = i[0]        search_end = i[1]        availability = search_and_book_availability(matrix, search_start, search_end)
查看完整描述

1 回答

?
眼眸繁星

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊

使用您的函數(shù)和以下代碼來(lái)分析速度


import time


shape = (10, 1440)

matrix = np.zeros(shape)

sim_start = 0

sim_end = 1440

searches = generate_searches(1000000, sim_start, sim_end)


def reset():

    matrix[:] = 0


def test_matrix_speed():

    for i in searches:

        search_start = i[0]

        search_end = i[1]

        availability = search_and_book_availability(matrix, search_start, search_end)


def timeit(func):

    # warmup

    reset()

    func()


    reset()

    start = time.time()

    func()

    end = time.time()


    return end - start


print(timeit(test_matrix_speed))

我發(fā)現(xiàn)jited 版本大約為 11.5s,而沒(méi)有jit. 我不是 numba 方面的專家,但它的目的是優(yōu)化以非矢量化方式編寫的數(shù)字代碼,尤其是顯式for循環(huán)。在您的代碼中沒(méi)有,您只使用矢量化操作。因此,我預(yù)計(jì)jit不會(huì)超過(guò)基線解決方案,但我必須承認(rèn),我很驚訝地看到它更糟。如果您想優(yōu)化您的解決方案,您可以使用以下代碼減少執(zhí)行時(shí)間(至少在我的 PC 上):


def search_and_book_availability_opt(matrix, search_start, search_end):

    search_slice = matrix[:, search_start:search_end]


    # we don't need to sum in order to check if all elements are 0.

    # ndarray.any() can use short-circuiting and is therefore faster.

    # Also, we don't need the selected values from np.where, only the

    # indexes, so np.nonzero is faster

    bookable, = np.nonzero(~search_slice.any(axis=1))


    # short circuit

    if bookable.size == 0:

        return False


    # we can perform random choice even if size is 1

    id_to_book = np.random.choice(bookable)

    matrix[id_to_book, search_start:search_end] = 1

    return True

并通過(guò)初始化matrix為np.zeros(shape, dtype=np.bool),而不是默認(rèn)值float64。我能夠獲得大約 3.8 秒的執(zhí)行時(shí)間,比您的 unjited 解決方案提高了約 50%,比 jted 版本提高了約 70%。希望有幫助。


查看完整回答
反對(duì) 回復(fù) 2021-11-09
  • 1 回答
  • 0 關(guān)注
  • 687 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)