অন্যদের দ্বারা ব্যাখ্যা হিসাবে, এটা ঠিক রেফারেন্স অনুলিপি কিন্তু না বস্তু ভিতরে রেফারেন্স গন্য বৃদ্ধি এবং এইভাবে বস্তু হয় অ্যাক্সেস এবং ক্যাশে একটি ভূমিকা পালন করে।
এখানে আমি আরও পরীক্ষা-নিরীক্ষা যুক্ত করতে চাই। শাফলযুক্ত বনাম আনস্ফুল্ড সম্পর্কে তেমন কিছু নয় (যেখানে কোনও উপাদান অ্যাক্সেস করা ক্যাশে মিস করতে পারে তবে নিম্নলিখিত উপাদানগুলিকে ক্যাশে প্রবেশ করতে পারে যাতে তারা আঘাত পায়)। তবে উপাদানগুলির পুনরাবৃত্তি সম্পর্কে যেখানে পরবর্তী সময়ে একই উপাদানটির অ্যাক্সেসগুলি ক্যাশে আঘাত করতে পারে কারণ উপাদানটি এখনও ক্যাশে রয়েছে।
একটি সাধারণ ব্যাপ্তি পরীক্ষা করা:
>>> from timeit import timeit
>>> a = range(10**7)
>>> [timeit(lambda: list(a), number=100) for _ in range(3)]
[5.1915339142808925, 5.1436351868889645, 5.18055115701749]
একই আকারের একটি তালিকা কিন্তু কেবল একটি উপাদান দিয়ে বারবার পুনরাবৃত্তি করা দ্রুত হয় কারণ এটি সর্বদা ক্যাশে আঘাত করে:
>>> a = [0] * 10**7
>>> [timeit(lambda: list(a), number=100) for _ in range(3)]
[4.125743135926939, 4.128927210087596, 4.0941229388550795]
এটি কোন সংখ্যাটি বলে মনে হচ্ছে না:
>>> a = [1234567] * 10**7
>>> [timeit(lambda: list(a), number=100) for _ in range(3)]
[4.124106479141709, 4.156590225249886, 4.219242600790949]
মজার বিষয় হল, আমি পরিবর্তে একই দুটি বা চারটি উপাদানের পুনরাবৃত্তি করলে এটি আরও দ্রুত হয়:
>>> a = [0, 1] * (10**7 / 2)
>>> [timeit(lambda: list(a), number=100) for _ in range(3)]
[3.130586101607932, 3.1001001764957294, 3.1318465707127814]
>>> a = [0, 1, 2, 3] * (10**7 / 4)
>>> [timeit(lambda: list(a), number=100) for _ in range(3)]
[3.096105435911994, 3.127148431279352, 3.132872673690855]
আমি অনুমান করি যে কোনও কিছুতে একই সময় একই পরিমাণ বাড়ানো পছন্দ হয় না। হয়ত কিছু পাইপলাইন স্টল কারণ প্রতিটি বৃদ্ধি পূর্ববর্তী বৃদ্ধির ফলাফলের জন্য অপেক্ষা করতে হয় তবে এটি একটি বুনো অনুমান।
যাইহোক, পুনরাবৃত্ত উপাদানগুলির বৃহত্তর সংখ্যার জন্য এটি চেষ্টা করে:
from timeit import timeit
for e in range(26):
n = 2**e
a = range(n) * (2**25 / n)
times = [timeit(lambda: list(a), number=20) for _ in range(3)]
print '%8d ' % n, ' '.join('%.3f' % t for t in times), ' => ', sum(times) / 3
আউটপুট (প্রথম কলামটি বিভিন্ন উপাদানের সংখ্যা, প্রত্যেকটির জন্য আমি তিনবার পরীক্ষা করি এবং তারপরেও গড় গ্রহণ করি):
1 2.871 2.828 2.835 => 2.84446732686
2 2.144 2.097 2.157 => 2.13275338734
4 2.129 2.297 2.247 => 2.22436720645
8 2.151 2.174 2.170 => 2.16477771575
16 2.164 2.159 2.167 => 2.16328197911
32 2.102 2.117 2.154 => 2.12437970598
64 2.145 2.133 2.126 => 2.13462250728
128 2.135 2.122 2.137 => 2.13145065221
256 2.136 2.124 2.140 => 2.13336283943
512 2.140 2.188 2.179 => 2.1688431668
1024 2.162 2.158 2.167 => 2.16208440826
2048 2.207 2.176 2.213 => 2.19829998424
4096 2.180 2.196 2.202 => 2.19291917834
8192 2.173 2.215 2.188 => 2.19207065277
16384 2.258 2.232 2.249 => 2.24609975704
32768 2.262 2.251 2.274 => 2.26239771771
65536 2.298 2.264 2.246 => 2.26917420394
131072 2.285 2.266 2.313 => 2.28767871168
262144 2.351 2.333 2.366 => 2.35030805124
524288 2.932 2.816 2.834 => 2.86047313113
1048576 3.312 3.343 3.326 => 3.32721167007
2097152 3.461 3.451 3.547 => 3.48622758473
4194304 3.479 3.503 3.547 => 3.50964316455
8388608 3.733 3.496 3.532 => 3.58716466865
16777216 3.583 3.522 3.569 => 3.55790996695
33554432 3.550 3.556 3.512 => 3.53952594744
সুতরাং একটি একক (পুনরাবৃত্ত) উপাদানগুলির জন্য প্রায় 2.8 সেকেন্ড থেকে এটি 2, 4, 8, 16, ... বিভিন্ন উপাদানগুলির জন্য প্রায় 2.2 সেকেন্ডে নেমে আসে এবং এক লক্ষ হাজার অবধি প্রায় ২.২ সেকেন্ডে অবস্থান করে। আমি মনে করি এটি আমার এল 2 ক্যাশে ব্যবহার করে (4 × 256 কেবি, আমার একটি আই 7-6700 রয়েছে )।
তারপরে কয়েক ধাপে সময়গুলি 3.5 সেকেন্ডে চলে যায়। আমি মনে করি এটির "ক্লান্ত" না হওয়া অবধি এটি আমার L2 ক্যাশে এবং আমার L3 ক্যাশে (8 এমবি) মিশ্রণ ব্যবহার করবে।
শেষে এটি প্রায় 3.5 সেকেন্ডে স্থিত হয়, আমি অনুমান করি কারণ আমার ক্যাশেগুলি পুনরাবৃত্ত উপাদানগুলির সাথে আর সহায়তা করে না।