নিয়মিত পাইথন তালিকার তুলনায় NumPy এর সুবিধা কী?


465

কি কি সুবিধা আছে নিয়মিত পাইথন তালিকার নিমপির ?

আমার প্রায় 100 টি আর্থিক বাজারের সিরিজ রয়েছে এবং আমি 100x100x100 = 1 মিলিয়ন ঘরের একটি কিউব অ্যারে তৈরি করতে যাচ্ছি। আমি স্ট্যান্ডার্ড ত্রুটিগুলি সহ অ্যারে পূরণ করার জন্য, প্রতিটি y এবং z দিয়ে প্রতিটি এক্সকে (3-ভেরিয়েবল) রিগ্রিজ করব।

আমি শুনেছি "বড় ম্যাট্রিক্স" এর জন্য পারফরম্যান্স এবং স্কেলাবিলিটি কারণে আমার পাইথনের তালিকার বিপরীতে নুমপি ব্যবহার করা উচিত। কথাটি হচ্ছে, আমি পাইথন তালিকাগুলি জানি এবং তারা মনে হয় আমার পক্ষে কাজ করে।

আমি নম্পপিতে চলে গেলে কী কী সুবিধা হবে?

যদি আমার 1000 টি সিরিজ থাকে (যা কিউবে 1 বিলিয়ন ভাসমান পয়েন্ট কোষ) থাকে?

উত্তর:


726

পাইপথনের তালিকার চেয়ে নুমপির অ্যারেগুলি আরও কমপ্যাক্ট - পাইথনের বর্ণনা অনুসারে তালিকার একটি তালিকা কমপক্ষে 20 এমবি বা তার বেশি সময় লাগবে, যখন কোষগুলিতে একক নির্ভুলতা সহ একটি নুমপি 3 ডি অ্যারে 4 এমবি ফিট হবে fit NumPy এর সাথে আইটেমগুলি পড়া এবং লেখার অ্যাক্সেসও দ্রুত।

হতে পারে আপনি কেবলমাত্র এক মিলিয়ন কোষের জন্য এতোটা যত্নবান নন, তবে আপনি অবশ্যই এক বিলিয়ন কোষের জন্য চাইবেন - কোনও 32-বিট আর্কিটেকচারের সাথেও মাপসই করা হবে না, তবে 64-বিট বিল্ডসের সাথে নুমপি 4 গিগাবাইট বা তার সাথে দূরে চলে যাবে with পাইথনের একা প্রয়োজন কমপক্ষে প্রায় 12 জিবি (পয়েন্টার যা আকার দ্বিগুণ) - হার্ডওয়ারের অনেক দামি টুকরো!

পার্থক্যটি বেশিরভাগ "অপ্রত্যক্ষতার" কারণে ঘটে - একটি পাইথন তালিকাটি পাইথন অবজেক্টের প্রতি বিন্দুর বিন্যাস, পয়েন্টার প্রতি কমপক্ষে 4 বাইট এবং এমনকি ক্ষুদ্রতম পাইথন অবজেক্টের জন্য 16 বাইট (রেফারেন্স গণনার জন্য 4 টাইপ পয়েন্টার, 4) মানটির জন্য - এবং মেমরির বরাদ্দকারীগুলি 16 এর চেয়ে বেশি হয়)। একটি NumPy অ্যারে ইউনিফর্ম মানের একটি অ্যারে - একক নির্ভুল সংখ্যা প্রতিটি 4 বাইট, ডাবল-নির্ভুলতা, 8 বাইট লাগে কম নমনীয়, তবে আপনি স্ট্যান্ডার্ড পাইথন তালিকার নমনীয়তার জন্য যথেষ্ট পরিমাণে অর্থ প্রদান করেন!


আমি পাইথন তালিকার আকার এবং নম্পপি অ্যারের আকারের সাথে একই সংখ্যার উপাদানগুলির তুলনা করতে "sys.getsizeof ()" ব্যবহার করার চেষ্টা করেছি এবং এটি NumPy অ্যারেগুলির চেয়ে অনেক ছোট ছিল বলে মনে হয় না। এটি কেস বা sys.getsizeof () এর মধ্যে NumPy অ্যারে কতটা বড় তা নির্ধারণ করার সমস্যা রয়েছে?
জ্যাক সিম্পসন

3
@ জ্যাকসিম্পসন getsizeofনির্ভরযোগ্য নয়। ডকুমেন্টেশন পরিষ্কারভাবে বলেছে যে: কেবলমাত্র বস্তুর সাথে সরাসরি দায়ী মেমোরি খরচ হ'ল তার জন্য ব্যবহৃত বস্তুর মেমরি খরচ নয়। এর অর্থ হ'ল আপনি অজগরটি তালিকাবদ্ধ করে থাকলে উপাদানগুলির আকারটি বিবেচনায় নেওয়া হয় না।
বাকুরিউ

4
getsizeofএকটি তালিকার তালিকায় কেবলমাত্র আপনাকে জানিয়ে দেয় যে তালিকার অবজেক্টটি নিজে নিজে কতটা র্যাম ব্যবহার করে এবং তার ডেটা অ্যারেতে পয়েন্টারগুলির দ্বারা ব্যবহৃত র‌্যাম, এটি আপনাকে নির্দেশ দেয় না যে এই পয়েন্টারগুলি উল্লেখ করে যে অবজেক্টগুলি দ্বারা কতটা র্যাম ব্যবহার করা হয়।
প্রধানমন্ত্রী 2Ring

@ অ্যালেক্সমার্টেলি, আপনি কি দয়া করে আমাকে জানতে পারেন আপনি এই নম্বরগুলি কোথায় পাচ্ছেন?
lmiguelvargasf

কেবলমাত্র শীর্ষস্থানীয়, তালিকার তালিকার সমান পাইথন তালিকার আকারের উপর আপনার অনুমান বন্ধ। সি float(4 বাইট) এর 4 গিগাবাইট ন্যাম্পি অ্যারে 12 জিবি নয়, 32 গিগাবাইট মূল্যের listএস এবং পাইথন floatএস (যা আসলে সি doubleএস) এর কাছাকাছি কিছুতে অনুবাদ করবে ; প্রতিটি floaton৪ বিট পাইথন alloc 24 বাইট (বরাদ্দকারীর কোনও প্রান্তিক ক্ষতি না ধরে) দখল করে, এবং আরও 8 বাইট listরেফারেন্স ধরে রাখার জন্য (এবং এটি listনিজেরাই সামগ্রিককরণ এবং অবজেক্ট শিরোনামকে উপেক্ষা করে, যা নির্ভর করে অন্য কোনও জিবি যুক্ত করতে পারে ঠিক কতটা সামগ্রিকভাবে ঘটে)
শ্যাডোর্যাঞ্জার

232

নুমপি কেবল আরও দক্ষ নয়; এটা আরও সুবিধাজনক। আপনি নিখরচায় ভেক্টর এবং ম্যাট্রিক্স অপারেশনগুলি পান যা কখনও কখনও একজনকে অপ্রয়োজনীয় কাজ এড়াতে দেয়। এবং সেগুলিও দক্ষতার সাথে বাস্তবায়িত হয়।

উদাহরণস্বরূপ, আপনি আপনার ঘনকটি কোনও ফাইল থেকে সরাসরি অ্যারেতে পড়তে পারেন:

x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))

দ্বিতীয় মাত্রা বরাবর যোগফল:

s = x.sum(axis=1)

কোন কোষ একটি চৌম্বের উপরে রয়েছে তা সন্ধান করুন:

(x > 0.5).nonzero()

তৃতীয় মাত্রা সহ প্রতিটি সম-সূচিকৃত স্লাইস সরান:

x[:, :, ::2]

এছাড়াও অনেকগুলি দরকারী গ্রন্থাগার NumPy অ্যারে নিয়ে কাজ করে। উদাহরণস্বরূপ, পরিসংখ্যান বিশ্লেষণ এবং ভিজ্যুয়ালাইজেশন লাইব্রেরি।

আপনার পারফরম্যান্স সমস্যা না থাকলেও, NumPy শেখার প্রচেষ্টা মূল্যবান।


ধন্যবাদ - আপনি আপনার তৃতীয় উদাহরণে আরও একটি ভাল কারণ সরবরাহ করেছেন, যেমন সত্য, আমি প্রান্তিকের উপরের ঘরগুলির জন্য ম্যাট্রিক্সটি অনুসন্ধান করব। তদুপরি, আমি স্ক্লাইলাইট থেকে লোড করছি। ফাইল অ্যাপ্রোচ অনেক বেশি দক্ষ হবে।
থমাস ব্রাউন

112

অ্যালেক্স স্মৃতি দক্ষতার উল্লেখ করেছেন এবং রবার্তো সুবিধার্থে উল্লেখ করেছেন এবং এটি উভয়ই ভাল পয়েন্ট। আরও কয়েকটি ধারণার জন্য, আমি গতি এবং কার্যকারিতা উল্লেখ করব ।

কার্যকারিতা: আপনি নম্পপি, এফএফটি, কনভলিউশনস, দ্রুত অনুসন্ধান, মৌলিক পরিসংখ্যান, লিনিয়ার বীজগণিত, হিস্টোগ্রাম ইত্যাদি দিয়ে অনেক কিছু তৈরি করেছেন এবং সত্যই, এফএফটি ছাড়া কে বাঁচতে পারে?

গতি: এখানে একটি তালিকা এবং একটি NumPy অ্যারের উপর যোগফল করার একটি পরীক্ষা রয়েছে যা দেখায় যে NumPy অ্যারেতে যোগফল 10x দ্রুত হয় (এই পরীক্ষায় - মাইলেজ পৃথক হতে পারে)।

from numpy import arange
from timeit import Timer

Nelements = 10000
Ntimeits = 10000

x = arange(Nelements)
y = range(Nelements)

t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list:  %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))

যা আমার সিস্টেমে (যখন আমি ব্যাকআপ চালাচ্ছি) তা দেয়:

numpy: 3.004e-05
list:  5.363e-04

44

Scipy.org ওয়েবসাইটে FAQ- র একটি সুন্দর উত্তর এখানে দেওয়া হয়েছে :

ন্যামপি অ্যারে পাইস্টন তালিকার উপরে (নেস্টেড) আরও কী কী সুবিধা দেয়?

পাইথনের তালিকাগুলি দক্ষ সাধারণ-উদ্দেশ্যে পাত্রে। তারা দক্ষ সন্নিবেশ, মুছে ফেলা, সংযোজন এবং সংমিশ্রণ সমর্থন করে (পাইথনের তালিকার বোঝাপড়াগুলি তাদের নির্মাণ ও কৌশলগুলি সহজ করে তোলে। যাইহোক, তাদের নির্দিষ্ট সীমাবদ্ধতা রয়েছে: তারা মৌলিক সংযোজন এবং গুণকের মতো "ভেক্টরাইজড" অপারেশনগুলিকে সমর্থন করে না এবং এগুলির মধ্যে পৃথক পৃথক ধরণের জিনিস থাকতে পারে তার অর্থ পাইথন অবশ্যই প্রতিটি উপাদানটির জন্য টাইপ তথ্য সংরক্ষণ করতে পারে এবং প্রকার প্রেরণকারী কোড কার্যকর করতে হবে যখন প্রতিটি উপাদান অপারেটিং। এর অর্থ হ'ল দক্ষ সি লুপ দ্বারা খুব কম তালিকা অপারেশন করা যেতে পারে - প্রতিটি পুনরাবৃত্তির জন্য টাইপ চেক এবং অন্যান্য পাইথন এপিআই বুককিপিংয়ের প্রয়োজন হবে।


9

সকলেই ন্যালি অ্যারে এবং পাইথন তালিকার মধ্যে প্রায় সমস্ত বড় পার্থক্য তুলে ধরেছেন, আমি তাদের এখানে সংক্ষেপে জানাব:

  1. অজগর তালিকার (যা গতিবেগের সাথে বৃদ্ধি পেতে পারে) বিপরীতে নিম্পি অ্যারেগুলির একটি নির্দিষ্ট আকার রয়েছে creation নাদারের আকার পরিবর্তন করা একটি নতুন অ্যারে তৈরি করবে এবং আসলটি মুছবে।

  2. নম্পি অ্যারের উপাদানগুলির জন্য সমস্ত একই ডাটা টাইপের হওয়া প্রয়োজন (আমাদের পাশাপাশি ভিন্নধর্মী টাইপ থাকতে পারে তবে এটি আপনাকে গাণিতিক ক্রিয়াকলাপের অনুমতি দেবে না) এবং মেমরির ক্ষেত্রে একই আকার হবে

  3. নম্পি অ্যারেগুলিকে প্রচুর পরিমাণে ডেটাতে গাণিতিক এবং অন্যান্য ধরণের ক্রিয়াকলাপগুলি সহজতর করা হয়। সাধারণত এ জাতীয় ক্রিয়াকলাপগুলি আরও দক্ষতার সাথে এবং সিকোয়েন্সগুলিতে পাইথন বিল্ড ব্যবহারের চেয়ে কম কোড সহ কার্যকর করা হয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.