سؤال

نظرًا لأن لدي مليون سطر من 20 إلى 100 رمزًا تقريبًا لكل سطر محدد بمسافات بيضاء، فإن حساب طول كل سطر يصبح أمرًا غير تافه.

على افتراض أنه لا توجد مسافات بيضاء مزدوجة بين رمزين مميزين،

  1. يكون len(text.split()) اسرع من text.count(" ")+1?

  2. ولماذا ذلك؟

هل كانت مفيدة؟

المحلول

من السهل التحقق مما هو أسرع:

>python -m timeit -s "s='q w e r t y u i o p a s d f g h j k l'" "s.count(' ')+1"
1000000 loops, best of 3: 0.272 usec per loop

>python -m timeit -s "s='q w e r t y u i o p a s d f g h j k l'" "len(s.split())"
1000000 loops, best of 3: 0.653 usec per loop

split أبطأ، ربما لأنه يقوم بإنشاء القائمة المقسمة.

نصائح أخرى

text.count(" ") غير صحيح، انظر أدناه:

In [706]: t='a  b    c'

In [707]: t.split()
Out[707]: ['a', 'b', 'c']

In [708]: t.count(' ')
Out[708]: 6

أنت لا تريد الحصول على 6 في هذه الحالة.

فرضيتك غير صحيحة.كلتا العمليتين لا تعطيان نفس النتائج، فلنستخدم سؤالك كمثال:

>>> text = "Given that I have 1,000,000,000 lines of ~20-100 tokens per line delimited by whitespace, counting the length of each line becomes sort of non-trival."
>>> len(text.split())
24
>>> text.count(" ")
23

نظرًا لسؤالك حول "حساب طول كل سطر" فإن أياً من هذه العمليات لا تفعل ذلك.

لحساب كل سطر عليك القيام بما يلي:

line_lengths = [len(line) for line in text.splitlines()]

ولكن ربما يكون من الأفضل أيضًا ملاحظة رقم السطر:

line_lengths = [(idx, len(line)) for idx, line in enumerate(text.splitlines())]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top