2016-07-24 7 views
5

मैं कई अलग-अलग फाइलों से जानकारी के छोटे टुकड़ों को अक्सर पढ़ने/लिखने का इरादा रखता हूं। निम्नलिखित कुछ हद तक विकसित उदाहरण दिखाता है कि os का उपयोग करते समय फ़ाइल डिस्क्रिप्टर पर सीधे कार्य करने के लिए पर्याप्त समय लगता है। क्या मुझे फाइल ऑब्जेक्ट्स की सुविधा के अलावा कोई नकारात्मकता याद आ रही है?os.open/read/write/close का स्वीकार्य उपयोग?

import os 
import time 

N = 10000 
PATH = "/tmp/foo.test" 

def testOpen(): 
    for i in range(N): 
     with open(PATH, "wb") as fh: 
      fh.write("A") 

    for i in range(N): 
     with open(PATH, "rb") as fh: 
      s = fh.read() 

def testOsOpen(): 
    for i in range(N): 
     fd = os.open(PATH, os.O_CREAT | os.O_WRONLY) 
     try: 
      os.write(fd, "A") 
     finally: 
      os.close(fd) 

    for i in range(N): 
     fd = os.open(PATH, os.O_RDONLY) 
     try: 
      s = os.read(fd, 1) 
     finally: 
      os.close(fd) 

if __name__ == "__main__": 
    for fn in testOpen, testOsOpen: 
     start = time.time() 
     fn() 
     print fn.func_name, "took", time.time() - start 

नमूना रन:

$ python bench.py 
testOpen took 1.82302999496 
testOsOpen took 0.436559915543 
+0

पायथन का कौन सा संस्करण? – user2682863

+0

@ user2682863, यह पायथन 2 होना चाहिए - पायथन 3 में निम्न स्तर के आईओ ऑप्स की आवश्यकता होती है और स्ट्रिंग्स के बजाय "बाइट्स जैसी ऑब्जेक्ट्स" की आवश्यकता होती है। यही है, यह कोड पी 3 के तहत नहीं चलेगा। –

+0

मैं 2 का उपयोग कर रहा हूं, लेकिन अगर 0 में उल्लेखनीय अंतर हैं तो 0 उत्सुक हैं। – Ben

उत्तर

1

मैं सिर्फ इसलिए इस खुले रहते हैं नहीं है जवाब देंगे हमेशा के लिए ;-)

वहाँ कहने के लिए वास्तव में कम है: के रूप में आप पहले से ही बताया गया है, एक file वस्तु अधिक सुविधाजनक है। में मामलों में यह और अधिक कार्यात्मक है; उदाहरण के लिए, वह अपने (file_object.readline() की तरह) गति लाइन उन्मुख पाठ संचालन के बफरिंग की अपनी परत (btw, कि एक कारण यह धीमी भी है।) करता है और एक file वस्तु सभी प्लेटफार्मों में एक ही तरह काम करने के लिए प्रयास करता है।

लेकिन आप की जरूरत है/नहीं है, तो चाहते हैं कि, कुछ भी नहीं है सब पर बजाय निचले स्तर & zippier os फ़ाइल वर्णनकर्ता कार्यों का उपयोग कर के साथ कुछ गलत। वहाँ बाद के कई हैं, और सभी नहीं सभी प्लेटफार्मों पर समर्थन कर रहे हैं, और सभी विकल्पों सभी प्लेटफार्मों पर समर्थित हैं। निस्संदेह आप अपने प्लेटफार्मों के चौराहे में & विकल्पों के संचालन के लिए अपने आप को प्रतिबंधित करने के लिए ज़िम्मेदार हैं (जो आमतौर पर os में सभी कार्यों के बारे में सच है, न केवल इसकी फाइल डिस्क्रिप्टर फ़ंक्शंस - नाम os एक मजबूत संकेत है कि इसमें मौजूद सामान ओएस-निर्भर हो सकता है)।

अजगर 2 और 3 के संबंध में, मतभेद मजबूत भेद अजगर 3 "पाठ" और सभी प्लेटफार्मों पर "बाइनरी" मोड के बीच में आता है की वजह से कर रहे हैं। यह एक यूनिकोड दुनिया है, और file वस्तुओं के लिए "टेक्स्ट मोड" इच्छित एन्कोडिंग निर्दिष्ट किए बिना कोई समझ नहीं आता है। अजगर 3 में, एक file वस्तु पढ़ने विधि एक str वस्तु (एक यूनिकोड स्ट्रिंग) फ़ाइल "पाठ मोड" में खोला गया था, तो देता है, लेकिन एक bytes वस्तु "बाइनरी मोड" में हैं। इसी प्रकार लेखन विधियों के लिए।

क्योंकि os फ़ाइल वर्णनकर्ता तरीकों एन्कोडिंग का बोध भी नहीं है, वे केवल चाहे, जैसे, विंडोज पर, फ़ाइल वर्णनकर्ता निम्न स्तर के साथ खोला गया था परवाह किए बिना अजगर 3 (में बाइट्स की तरह वस्तुओं के साथ काम कर सकते हैं os.open()O_BINARY या O_TEXT झंडे)।

अभ्यास में, उदाहरण आपके द्वारा दिया गया है, यह सिर्फ मतलब है कि आप करने के लिए

b"A" 

नोट

"A" 

के उदाहरण को बदलने के लिए है कि आप भी एक में b"..." शाब्दिक वाक्य विन्यास का उपयोग कर सकते हैं के लिए होता है पाइथन 2 का हालिया संस्करण, हालांकि यह अभी भी पायथन 2 में केवल एक स्ट्रिंग अक्षर है। पायथन 3 में यह एक अलग प्रकार की वस्तु (bytes) को इंगित करता है, और फ़ाइल डिस्क्रिप्टर फ़ंक्शन बाइट्स जैसी वस्तुओं को लिखने और वापस करने के लिए प्रतिबंधित हैं।

लेकिन अगर आप "बाइनरी डेटा" के साथ काम कर रहे हैं, कि कोई प्रतिबंध नहीं सब पर है। यदि आप "टेक्स्ट डेटा" के साथ काम कर रहे हैं, तो हो सकता है (अनुमान लगाने के लिए आपके विनिर्देशों के बारे में पर्याप्त जानकारी नहीं है)।

+0

धन्यवाद, टिम। मैं किसी ऐसे व्यक्ति की अंतर्दृष्टि की सराहना करता हूं जो इतने लंबे समय तक पाइथन से काफी जुड़ा हुआ है। मैं '' struct'' का उपयोग कर बाइनरी डेटा के साथ काम कर रहा हूं। मैं सिर्फ पूर्ण रूप से यथासंभव पूर्णांक को स्टोर और पुनर्प्राप्त करने के लिए नो-फ्रिल तरीका ढूंढ रहा हूं, और प्रथम श्रेणी 'फ़ाइल' ऑब्जेक्ट्स का प्रदर्शन जुर्माना मेरे उपयोग के मामले के बिना किसी भी लाभ के बिना काफी अधिक लग रहा था। हालांकि मुझे लगता है कि अगर मुझे प्रदर्शन के बारे में बहुत कुछ ख्याल रखना है, तो मुझे केवल सी – Ben

+0

का उपयोग करना चाहिए। अधिक महत्वपूर्ण गति है, _longer_ मैं शुद्ध पायथन से चिपक जाता हूं ;-) केवल आंशिक रूप से मजाक कर रहा है: पायथन इतना धीमा हो सकता है कि चिपकना पाइथन के लिए मुझे _fundamentally_ बेहतर दृष्टिकोण के साथ आने के लिए मजबूर करता है। उदाहरण के लिए, हो सकता है कि आपको "वास्तव में" की आवश्यकता हो, डेटाबेस या डिक्ट्स का चालाक उपयोग हो या ... इसके चेहरे पर, कुछ बाइट्स बदलने के लिए फ़ाइल खोलना और बंद करना असंगत है: भाषा के बावजूद, यह है छोटे काम के लिए उच्च ओवरहेड पूरा किया। और अन्य दृष्टिकोणों की कोशिश करना आपके लिए पाइथन तक लंबे समय तक आसान है :-) –

संबंधित मुद्दे