コーディングテストの練習サイトCodilityのCountSemiprimesという問題を解いています。
CountSemiprimesについて日本語で書かれた記事

書いたコードを実行したところ、以下のエラーが出たため、出力の正しさを確認することができていません。
どのように修正するべきでしょうか。

Compilation successful.

Example test:    (26, [1, 4, 16], [26, 10, 20]) 
TIMEOUT ERROR  (running time: >5.00 sec., time limit: 5.00 sec.) 

Detected some errors.

書いたコード

import itertools
import math

def solution(N, P, Q):
    #素数の配列を作成
    all = []
    nonprime = []
    for i in range (2, round(N/2)+1):
        all.append(i)
        #素数かどうか
        for m in range(2, int(math.sqrt(i))):
            if i % m == 0:
                nonprime.append(i)
    prime = set(all) - set(nonprime)         

    #semiprimeの配列を作成
    semiprime = []
    #全ての2つの組み合わせを作成し、かけ算をしてN以下のものを配列に追加
    possible = list(itertools.combinations(prime,2))
    for j in range (len(possible)):
        pairs = possible[j]
        num = pairs[0] * pairs[1]
        if num <= N:
            semiprime.append(num)

    #P[]とQ[]の配列の範囲にあるsemiprimeの数を数える
    result = []
    for l in range(len(P)):
        count = 0
        for k in range(len(semiprime)):
            while semiprime[k] >= P[l] and semiprime[k] <= Q[l]:
                count += 1
        result.append(count)

    return result