Почему больше ниток ухудшает производительность?

Следующий код получает 2 числа от пользователя и вычисляет, сколько простых чисел существует между этими числами. Выполнение кода (от 1 до 1000000) без потоков дало мне 2,8 секунды, а с двумя потоками (у моего процессора 2 ядра) - 4,8 секунды. Это проблема с ПК, код. Если бы вы могли попробовать запустить его на своем ПК и поделиться результатами, я бы поблагодарил вас за это. Если вы видите проблему с кодом или знаете, почему это происходит, поделитесь своими соображениями.

import math
from threading import Thread
from timeit import timeit

first_num = input()
last_num = input()

primes = []

def is_prime(num):
    if num == 2:
        return True

    if num == 1 or num % 2 == 0:
        return False

    for i in xrange(3, int(math.sqrt(num)) + 1, 2):
        if (num % i == 0):
            return False

    return True

def find_primes(numbers):
    for num in numbers:
        if is_prime(num):
           primes.append(num)

def targil_a():
    find_primes(xrange(first_num, last_num))

    print len(primes)

def targil_b():
    numbers = range(first_num, last_num)

    threads = []

    for i in xrange(2):
        part_len = int(len(numbers)/2)
        t = Thread(target=find_primes, args=(numbers[part_len*i: part_len*(i+1) + 1],))
        t.start()
        threads.append(t)

    for trd in threads:
        trd.join()

    print len(primes)

print timeit(targil_a, number=1)

primes = []

print timeit(targil_b, number=1)

0 ответов

Другие вопросы по тегам