С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 29.08.2019
Сообщений: 25

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

11.07.2022, 11:33. Показов 746. Ответов 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
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru