পাইথন তালিকা বনাম অ্যারে - কখন ব্যবহার করবেন?


374

আপনি যদি 1 ডি অ্যারে তৈরি করে থাকেন তবে আপনি এটিকে তালিকা হিসাবে প্রয়োগ করতে পারেন, না হলে স্ট্যান্ডার্ড লাইব্রেরিতে 'অ্যারে' মডিউলটি ব্যবহার করতে পারেন। আমি সর্বদা 1 ডি অ্যারের জন্য তালিকা ব্যবহার করেছি।

আমি এর পরিবর্তে অ্যারে মডিউলটি ব্যবহার করতে চাইলে এমন কারণ বা পরিস্থিতি কী?

এটি কি কর্মক্ষমতা এবং মেমরি অপ্টিমাইজেশনের জন্য, বা আমি কোনও স্পষ্ট কিছু মিস করছি?

উত্তর:


438

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

array.arrayধরন, অন্য দিকে, শুধু সি অ্যারে একটা পাতলা মোড়কের হয়। এটি কেবল একই জাতীয় সমস্ত ডেটা, একই ধরণের ধারণ করতে পারে এবং তাই এটি কেবল sizeof(one object) * lengthমেমরির বাইট ব্যবহার করে । বেশিরভাগ ক্ষেত্রে, আপনি যখন কোনও এক্সটেনশান বা সিস্টেম কল (যেমন উদাহরণস্বরূপ, ioctlবা fctnl) এর জন্য সি অ্যারে উন্মুক্ত করতে চান তখন আপনার এটি ব্যবহার করা উচিত ।

array.arrayপাইথন ২.x ( ) এর পরিবর্তিত স্ট্রিং উপস্থাপনের যুক্তিসঙ্গত উপায় array('B', bytes)। যাইহোক, পাইথন 2.6+ এবং 3.x হিসাবে একটি মিউটেবল বাইট স্ট্রিং উপলব্ধ bytearray

তবে, আপনি যদি সংখ্যার ডেটাগুলির একজাতীয় অ্যারেতে গণিত করতে চান , তবে আপনি NumPy ব্যবহার করা অনেক ভাল, যা জটিল মাল্টি-ডাইমেনশনাল অ্যারেতে স্বয়ংক্রিয়ভাবে অপারেশনটিকে ভেক্টরাইজ করতে পারে।

একটি দীর্ঘ গল্প সংক্ষিপ্ত করতে : array.arrayযখন আপনার গাণিতিক ব্যতীত অন্যান্য কারণে ডেটাগুলির একটি সমজাতীয় সি অ্যারের প্রয়োজন হয় তখন তা কার্যকর ।


9
Numpy.ndarray এর অ্যারে.আরারের মতো একই মেমরির পদচিহ্ন রয়েছে?
গর্ডন বিন

6
@ গর্ডন, এটি একটি বৃহত, সংলগ্ন অ্যারের ক্ষেত্রে একই রকম হওয়া উচিত: তাদের উভয়ের জন্য sizeof(element)× (উপাদানগুলির সংখ্যা) বাইট, এবং ওভারহেডের জন্য একটি ছোট ফিক্সড শিরোনামের প্রয়োজন হবে। যাইহোক, নাদারের কাছে বিচ্ছিন্ন এবং স্পার্স অ্যারেগুলি ব্যবহার করার জন্য কিছু উন্নত বিকল্প রয়েছে এবং আমি মনে করি বড় অ্যারেগুলির জন্য মেমরি বরাদ্দকরণের জন্য কিছু প্লাগযোগ্য কৌশলগুলি ... এর মধ্যে কয়েকটি উন্নত বৈশিষ্ট্য এটি ব্যবহারকারীকে কম স্মৃতি তৈরি করবে , অন্যরা আরও ব্যবহার করে কর্মক্ষমতা উন্নত করবে স্মৃতি.
ড্যান লেন্সকি

মেমোরির সমস্যা যখন যেমন মাইক্রোপথিন সহ মাইক্রো কন্ট্রোলার প্রোগ্রাম করার সময়ও কার্যকর
জ্যানস্কাস

একটি স্থির সময়ে অ্যারের Ith উপাদানটি অনুসন্ধান করতে পারে, তবে লিঙ্কযুক্ত তালিকায় এটি সবচেয়ে খারাপ ক্ষেত্রে অর্ডার 'এন' লাগে takes অজগর তালিকার প্রথম উপাদানটির সন্ধানের সময়টি কী?
নীতিশ ইনপার্সুট অফহ্যাপিনেস

7
নিথিশআইনপ্রসুইটওফ্যাপিনেস, পাইথনের তালিকাটি কোনও লিঙ্কযুক্ত তালিকা নয়। এটি অভ্যন্তরীণভাবে একটি অ্যারের হিসাবে প্রতিনিধিত্ব করে এবং জাভা এর অ্যারেলিস্টের মতো একই সময়ের জটিলতার বৈশিষ্ট্যগুলি রয়েছে। সুতরাং, পাইথন তালিকার প্রথম উপাদানটি পেতে এবং সেট করতে স্থির সময় লাগে । পাইথন তালিকায় একটি উপাদান যুক্ত করা নিয়মিত ধ্রুবক সময় নেয় কারণ অ্যারের আকার যখন স্থান ছাড়িয়ে যায় তখন দ্বিগুণ হয়। পাইথন তালিকার মাঝখানে থেকে কোনও উপাদান সন্নিবেশ করা বা সরাতে O (n) সময় লাগে কারণ উপাদানগুলি স্থানান্তরিত হওয়া দরকার। রেফারেন্সের জন্য, দেখুন: wiki.python.org/moin/TimeComplexity
জিওফলি

66

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


3
সম্ভব, যদিও এটি সত্যই ব্যবহৃত হয়নি, তবে কিছু মাইক্রো বেনমার্ক চালানো আকর্ষণীয় হবে।
আন্দ্রে

13
প্রকৃতপক্ষে, আমি একটি দ্রুত পরীক্ষা করেছি - আমি 100 এম এন্ট্রি সহ একটি তালিকা এবং একই অ্যারেটির সাথে একই পরীক্ষার সংমিশ্রণ করতে পেরেছিলাম, এবং তালিকাটি আসলে প্রায় 10% দ্রুত ছিল।
Moe

38
তালিকাগুলি দ্রুততর হয়, কারণ অ্যারে "কাঁচা" ডেটাতে ক্রিয়াকলাপগুলি অरे থেকে পড়া বা লেখার সময় অজগর অবজেক্টগুলি ক্রমাগত তৈরি এবং ধ্বংস করা প্রয়োজন।
tzot

7
@Moe, আমি উপরে আমার উত্তর নির্দিষ্ট, পাইথন এর বিল্ট-ইন arrayকরা হয় গণিত করছেন জন্য বোঝানো হয় না । আপনি যদি ndarray10 ^ 8 সংখ্যার অ্যারের যোগফলের জন্য NumPy এর চেষ্টা করেন তবে এটি পুরোপুরি listদূরে চলে যাবে। গণিতের জন্য বিল্ট-ইনটি arrayধীরে ধীরে কেন, এই বিষয়ে @tzot এর সঠিক ধারণা রয়েছে ।
ড্যান লেন্সকি

2
আমি কেবল এটি পরীক্ষা করেছি, আমার মেশিনে নম্পতি 86.6x দ্রুত।
চিহ্নিত করুন

53

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

কিছু ব্যবহারের তালিকার চেয়ে অ্যারে আরও দক্ষ। আপনার যদি কোনও অ্যারে বরাদ্দ করতে হয় যা আপনি জানেন যে কোনও পরিবর্তন হবে না, তবে অ্যারেগুলি দ্রুত হতে পারে এবং কম মেমরি ব্যবহার করতে পারে। জিভিআর-এর একটি অপ্টিমাইজেশন এনারকডোট রয়েছে যাতে অ্যারে মডিউলটি বিজয়ী হয়ে আসে (দীর্ঘ পঠিত তবে এটি মূল্যবান)।

অন্যদিকে, তালিকাগুলি অ্যারেগুলির চেয়ে বেশি মেমরি খায় তার কারণের একটি কারণ হ'ল সমস্ত বরাদ্দ উপাদান ব্যবহার করা হলে পাইথন কয়েকটি অতিরিক্ত উপাদান বরাদ্দ করবে। এর অর্থ হল তালিকায় আইটেম যুক্ত করা দ্রুত হয় is সুতরাং আপনি যদি আইটেমগুলি যুক্ত করার পরিকল্পনা করেন তবে একটি তালিকা যাওয়ার উপায়।

টিএল; ডিআর আমি কেবলমাত্র একটি অ্যারে ব্যবহার করতাম যদি আপনার ব্যতিক্রমী অপ্টিমাইজেশন প্রয়োজন হয় বা আপনার সি কোডের সাথে ইন্টারফেস করতে হবে (এবং পাইরেক্স ব্যবহার করতে পারবেন না )।


1
কংক্রিট উদাহরণ এবং গতির সুবিধার উল্লেখ জন্য +1। শীর্ষের উত্তরটি আমাকে অবাক করে দিয়েছিল, "কোনও সময়-স্মৃতি ট্রেড অফ আছে?" এবং "এর কোনও ব্যবহার কি এটি খুব রহস্যজনক লো-মেমরির ক্ষেত্রে নয়?"
লিউজ

@ Leewz ঠিক এই উত্তরটি বিবেচনা করা উচিত।
গৌরী শঙ্কর বদলা

21

এটি একটি বাণিজ্য বন্ধ!

প্রত্যেকের উপকার:

তালিকা

  • নমনীয়
  • ভিন্ন ভিন্ন হতে পারে

অ্যারে (উদা: নমপি অ্যারে)

  • অভিন্ন মানের অ্যারে
  • সজাতি
  • কমপ্যাক্ট (আকারে)
  • দক্ষ (কার্যকারিতা এবং গতি)
  • সুবিধাজনক

2
অজগরটিতে অ্যারে মডিউলটিতে প্রশ্নটি প্রকাশিত হচ্ছে; নোংরা অ্যারে নয়। আকার দক্ষতা ব্যতীত তাদের কাছে প্রচুর পরিমান পেশাদার নেই। তারা দ্রুত হয় না।
ননোনোনো

14

আমার বোধগম্যতা হল যে অ্যারেগুলি আরও দক্ষতার সাথে সঞ্চয় করা হয় (অর্থাত্ মেমরির সংলগ্ন ব্লক হিসাবে বনাম পাইথন অবজেক্টের প্রতি নির্দেশক), তবে আমি কোনও কার্যকারিতা সুবিধা সম্পর্কে অবগত নই। অতিরিক্তভাবে, অ্যারেগুলির সাথে আপনাকে অবশ্যই একই ধরণের আদিম সংরক্ষণ করতে হবে, তবে তালিকাগুলি যে কোনও কিছু সংরক্ষণ করতে পারে।


8

স্ট্যান্ডার্ড লাইব্রেরি অ্যারেগুলি বাইনারি আই / ও এর জন্য দরকারী, যেমন একটি ওয়েভ ফাইলকে লিখতে স্ট্রিংয়ে ইন্টের তালিকা অনুবাদ করে। এটি ইতিমধ্যে অনেকে উল্লেখ করেছেন, আপনি যদি কোনও বাস্তব কাজ করতে যাচ্ছেন তবে আপনার NumPy ব্যবহার করা উচিত।


6

আপনি যদি অ্যারে ব্যবহার করতে যাচ্ছেন তবে সেই নম্পি বা স্কিপি প্যাকেজগুলি বিবেচনা করুন, যা আপনাকে আরও অনেক নমনীয়তার সাথে অ্যারে দেয়।


5

অ্যারে কেবল নির্দিষ্ট ধরণের জন্য ব্যবহার করা যেতে পারে, তবে তালিকা কোনও বস্তুর জন্য ব্যবহার করা যেতে পারে।

অ্যারে কেবল এক প্রকারের ডেটাও রাখতে পারে, অন্যদিকে তালিকায় বিভিন্ন অবজেক্টের ধরণের প্রবেশ থাকতে পারে।

কিছু সংখ্যার গণনার জন্য অ্যারে আরও দক্ষ।


4
বিল্টিন পাইথন অ্যারেগুলি পারফরম্যান্স-ভিত্তিক দক্ষ নয়, কেবল স্মৃতি-ভিত্তিক।
tzot

এমন উদাহরণ রয়েছে যেখানে প্রসেসিংয়ের ক্ষেত্রে অ্যারে আরও দক্ষ। নীচে আমার পোস্টটি দেখুন: stackoverflow.com/questions/176011/…
জেসন বেকার

0

নমপি অ্যারে এবং তালিকার মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য হ'ল অ্যারে স্লাইসগুলি মূল অ্যারেতে দেখা। এর অর্থ এই যে ডেটা অনুলিপি করা হয়নি, এবং ভিউতে কোনও পরিবর্তনগুলি উত্স অ্যারেতে প্রতিফলিত হবে।


0

এই উত্তর কখন তালিকা এবং অ্যারে ব্যবহার করবেন সে সম্পর্কে প্রায় সমস্ত প্রশ্নের সমষ্টি করবে:

  1. এই দুটি ডেটা প্রকারের মধ্যে প্রধান পার্থক্য হ'ল আপনি যেগুলিতে সেগুলি সম্পাদন করতে পারেন operations উদাহরণস্বরূপ, আপনি একটি অ্যারে 3 দ্বারা বিভক্ত করতে পারেন এবং এটি অ্যারের প্রতিটি উপাদানকে 3 দ্বারা ভাগ করে দেবে S একই তালিকা দিয়ে কাজ করা যায় না।

  2. তালিকাটি পাইথনের সিনট্যাক্সের অংশ, সুতরাং এটি ঘোষণার দরকার নেই যেখানে এটির আগে আপনাকে অ্যারে ঘোষণা করতে হবে।

  3. আপনি একটি তালিকায় বিভিন্ন উপাত্তের ধরণের মান সংরক্ষণ করতে পারেন (ভিন্নধর্মী), তবে অ্যারেতে আপনি কেবলমাত্র একই ডেটা-টাইপের (সমজাতীয়) মান সংরক্ষণ করতে পারেন।

  4. অ্যারেগুলি কার্যকারিতা এবং দ্রুত সমৃদ্ধ হওয়ায় এটি গণিতের ক্রিয়াকলাপের জন্য এবং প্রচুর পরিমাণে ডেটা সঞ্চয় করার জন্য - তালিকার তুলনায় ব্যাপকভাবে ব্যবহৃত হয়।

  5. অ্যারে তালিকার তুলনায় কম স্মৃতি নেয়।

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