А я подобные числодробилки пишу на Python (не спешите смеяться) с применением
Numba.
700 млн * 64бит == 5.6Гб памяти. У меня столько нет, поэтому я возьму половину.
Итак, выборка 100 тысяч 64-битных значений из 350 миллионов пролетает за 0.315 секунд, значит с 700 миллионами я почти уложился бы в 0.6 секунд. Все это на довольно дешевом Pentium.
Это явно предел производительности железа и никакие ассемблеры не смогут ускорить решение этой задачи (более, чем на несколько процентов).
import numba as nb
import numpy as np
import time
max_value = np.iinfo(np.intc).max
@nb.jit(nopython=True)
def search(src, dst):
src_size, = src.shape
dst_size, = dst.shape
factor = max_value / src_size * dst_size
dst_ptr = 0
for src_ptr in range(src.size):
value = src[src_ptr]
if value < factor and dst_ptr < dst_size:
dst[dst_ptr] = value
dst_ptr += 1
def search_and_time_it(from_size, to_size):
src = np.random.randint(max_value, size=from_size)
dst = np.empty((to_size,))
t1 = time.time()
search(src, dst)
t2 = time.time()
print('search {0:,d} values from {1:,d} takes {2:.3f} seconds'.format(to_size, from_size, t2 - t1))
# search 100 000 values from 350 000 000
search_and_time_it(350 * 1000 * 1000, 100 * 1000)
Результат:
search 100,000 values from 350,000,000 takes 0.315 seconds