2 / 2 / 0
Регистрация: 29.08.2019
Сообщений: 25

Почему одномерные массивы работают медленнее, чем трехмерные

11.07.2022, 11:33. Показов 806. Ответов 1

Студворк — интернет-сервис помощи студентам
Столкнулся с похожей проблемой на С++, работа с трехмерным массивом быстрее чем работа с одномерным, хотя казалось бы нужно сделать меньше операций. Так что у меня вопрос, почему так получается?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from datetime import datetime
size = 100
 
class Vec:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
 
class Arr3D:
    def __init__(self):
        self.arr = [[[ None for _ in range(0, size)] for _ in range (0, size)] for _ in range(0, size)]
    
    def set(self, vec, value):
        self.arr[vec.x][vec.y][vec.z] = value
 
    def get(self, vec):
        return self.arr[vec.x][vec.y][vec.z]
 
class Arr1D:
    def __init__(self):
        self.arr = [None for _ in range(0, size * size * size)]
    
    def set(self, vec, value):
        self.arr[vec.x * size * size + vec.y * size + vec.z] = value
 
    def get(self, vec):
        return self.arr[vec.x * size * size + vec.y * size + vec.z]
 
def write(arr):
    for value in range(0, 10):
        for x in range(0, size):
            for y in range(0, size):
                for z in range(0, size):
                    arr.set(Vec(x, y, z), value)
 
def read(arr):
    for _ in range(0, 10):
        for x in range(0, size):
            for y in range(0, size):
                for z in range(0, size):
                    arr.get(Vec(x, y, z))
 
arr1d = Arr1D()
arr3d = Arr3D()
 
start = datetime.now()
write(arr1d)
print("Write 1D", datetime.now() - start)
 
start = datetime.now()
write(arr3d)
print("Write 3D", datetime.now() - start)
 
start = datetime.now()
read(arr1d)
print("Read 1D", datetime.now() - start)
 
start = datetime.now()
read(arr3d)
print("Read 3D", datetime.now() - start)
Результат в Debug:

Write 1D 0:00:09.612970
Write 3D 0:00:07.605029
Read 1D 0:00:09.376999
Read 3D 0:00:07.226009


Результат в Release, ещо хуже:

Write 1D 0:00:12.766999
Write 3D 0:00:07.552999
Read 1D 0:00:12.348959
Read 3D 0:00:07.484041


Добавлено через 24 минуты
Добавил немного рандома в порядок доступа, ситуация не изменилась:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from datetime import datetime
from random import randint
 
size = 100
 
class Vec:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
 
class Arr3D:
    def __init__(self):
        self.arr = [[[ None for _ in range(0, size)] for _ in range (0, size)] for _ in range(0, size)]
    
    def set(self, vec, value):
        self.arr[vec.x][vec.y][vec.z] = value
 
    def get(self, vec):
        return self.arr[vec.x][vec.y][vec.z]
 
class Arr1D:
    def __init__(self):
        self.arr = [None for _ in range(0, size * size * size)]
    
    def set(self, vec, value):
        self.arr[vec.x * size * size + vec.y * size + vec.z] = value
 
    def get(self, vec):
        return self.arr[vec.x * size * size + vec.y * size + vec.z]
 
repetition = 10
 
def write(arr):
    for value in range(0, repetition):
        for x in range(0, size):
            for y in range(0, size):
                for z in range(0, size):
                    arr.set(Vec(x, y, z), value)
 
def read(arr):
    for _ in range(0, repetition):
        for x in range(0, size):
            for y in range(0, size):
                for z in range(0, size):
                    arr.get(Vec(x, y, z))
 
 
rand_vec_for_write = [Vec(randint(0, size - 1), randint(0, size - 1), randint(0, size - 1)) for _ in range(0, repetition * size * size * size)]
def rand_write(arr):
    for i in range(0, repetition * size * size * size):
        arr.set(rand_vec_for_write[i], randint(0, size))
 
 
rand_vec_for_read = [Vec(randint(0, size - 1), randint(0, size - 1), randint(0, size - 1)) for _ in range(0, repetition * size * size * size)]
def rand_read(arr):
    for i in range(0, repetition * size * size * size):
        arr.get(rand_vec_for_read[i])
 
arr1d = Arr1D()
arr3d = Arr3D()
 
start = datetime.now()
write(arr1d)
print("Write 1D", datetime.now() - start)
 
start = datetime.now()
write(arr3d)
print("Write 3D", datetime.now() - start)
 
start = datetime.now()
read(arr1d)
print("Read 1D", datetime.now() - start)
 
start = datetime.now()
read(arr3d)
print("Read 3D", datetime.now() - start)
 
 
start = datetime.now()
rand_write(arr1d)
print("Rundom write 1D", datetime.now() - start)
 
start = datetime.now()
rand_write(arr3d)
print("Rundom write 3D", datetime.now() - start)
 
start = datetime.now()
rand_read(arr1d)
print("Random read 1D", datetime.now() - start)
 
start = datetime.now()
rand_read(arr3d)
print("Random read 3D", datetime.now() - start)
Результат:

Write 1D 0:00:09.863999
Write 3D 0:00:08.077039
Read 1D 0:00:09.308999
Read 3D 0:00:06.974959
Rundom write 1D 0:00:21.894000
Rundom write 3D 0:00:18.886042
Random read 1D 0:00:07.304023
Random read 3D 0:00:05.654001
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.07.2022, 11:33
Ответы с готовыми решениями:

Почему одномерные массивы работают медленнее, чем трехмерные
Всегда думал, что работать с многомерными массивами очень тяжелое дело, поскольку когда-то на курсах мне сказали, что операция...

Parallel.ForEach и ConcurrentDictionary работают медленнее чем обычный Dictionary
Здравствуйте! Есть задача. Массив содержит произвольные строки. Нужно подсчитать, сколько раз каждая из строк встречается в массиве. Задачу...

Почему VB выполняется намного медленнее, чем VBA?
Сделал макрос на VBA в CoreDraw (перебирает объекты, проверяет их свойства итд). Попытался перенести его на VB6. Все работает, но раз в...

1
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
11.07.2022, 15:13
Цитата Сообщение от Ser_Darked-Sun Посмотреть сообщение
Python
1
2
def set(self, vec, value):
        self.arr[vec.x][vec.y][vec.z] = value
Цитата Сообщение от Ser_Darked-Sun Посмотреть сообщение
Python
1
2
def set(self, vec, value):
        self.arr[vec.x * size * size + vec.y * size + vec.z] = value
Посчитайте количество умножений в одном и в другом случае
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.07.2022, 15:13
Помогаю со студенческими работами здесь

Почему некоторые программы на языке Python работают медленнее своих аналогов написанных на языках C/C++?
Python

Почему память работает намного медленнее, чем процессор?
Как решают эту проблему?

Почему array reverse на указателях медленнее, чем обычный?
Всем привет. Решил сравнить скорость работы алгоритма реверса массива. Думал на указателях быстрее, но оказалось что нет. Может я...

Почему быстрая сортировка работает медленнее, чем все остальные?
У меня такое задание: Составить программу, проводящую сравнительную характеристику методов сортировки массивов. Программа должна...

Почему Excel 2013 работает в 25 раз медленнее чем 2010
Здравствуйте, уважаемые эксперты. Столкнулся с проблемой не могу решить. В Excel 2010 макрос работает 0,218 сек. на стареньком...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru