python - যবহ - পাইথন টাইম্যাটের সাথে পরীক্ষার কার্য সম্পাদনের জন্য আমি কিভাবে একটি কোড সেগমেন্ট করতে পারি?




বাংলায় পাইথন (4)

আমার একটি পাইথন স্ক্রিপ্ট আছে যা এটি ঠিক করা উচিত, তবে আমাকে কার্যকর সময় লিখতে হবে। আমি timeit করেছি যে আমি timeit ব্যবহার করা উচিত কিন্তু আমি এটা কাজ পেতে বলে মনে হচ্ছে না।

আমার পাইথন স্ক্রিপ্টটি এরকম দেখাচ্ছে:

import sys
import getopt
import timeit
import random
import os
import re
import ibm_db
import time
from string import maketrans
myfile = open("results_update.txt", "a")

for r in range(100):
    rannumber = random.randint(0, 100)

    update = "update TABLE set val = %i where MyCount >= '2010' and MyCount < '2012' and number = '250'" % rannumber
    #print rannumber

    conn = ibm_db.pconnect("dsn=myDB","usrname","secretPWD")

for r in range(5):
    print "Run %s\n" % r        
    ibm_db.execute(query_stmt)
 query_stmt = ibm_db.prepare(conn, update)

myfile.close()
ibm_db.close(conn)

আমার যা দরকার তা হলো প্রশ্নটি চালানোর সময় এবং ফলাফল results_update.txt ফাইলে results_update.txt । উদ্দেশ্যটি বিভিন্ন সূচী এবং টিউনিং মেকানিজমের সাথে আমার ডাটাবেসের জন্য একটি আপডেট বিবৃতি পরীক্ষা করা।


আপনি যদি আপনার কোডটি প্রোফাইল করে থাকেন এবং %timeit ব্যবহার করতে পারেন তবে এটি ম্যাজিক ফাংশন %timeit

%%timeit কাজ করে।

In [2]: %timeit cos(3.14)
10000000 loops, best of 3: 160 ns per loop

In [3]: %%timeit
   ...: cos(3.14)
   ...: x = 2 + 3
   ...: 
10000000 loops, best of 3: 196 ns per loop

আপনি সময় করতে চান ব্লকের আগে এবং পরে time.time() বা time.clock() ব্যবহার করতে পারেন।

import time

t0 = time.time()
code_block
t1 = time.time()

total = t1-t0

এই পদ্ধতিটি timeit হিসাবে সঠিক নয় (এটি বেশ কয়েকটি রান timeit না) তবে এটি timeit

time.time() (উইন্ডোজ এবং লিনাক্সে) এবং time.clock() (লিনাক্সে) দ্রুত ফাংশনগুলির জন্য যথেষ্ট নয় (আপনি মোট = 0 পাবেন)। এই ক্ষেত্রে বা আপনি যদি কয়েকটি রান দ্বারা বিলম্বিত সময় গড়তে চান তবে আপনাকে নিজেও ফাংশনটি একাধিকবার কল করতে হবে (যেমন আমি মনে করি আপনি ইতিমধ্যেই আপনার ক্ষেত্রে এটি করেছেন, উদাহরণস্বরূপ কোড এবং সময়মত স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে কাজ করে)

import time

def myfast():
   code

n = 10000
t0 = time.time()
for i in range(n): myfast()
t1 = time.time()

total_n = t1-t0

উইন্ডোতে, কোরি মন্তব্যে বলেছেন, time.clock() দ্বিতীয়টির পরিবর্তে অনেক বেশি স্পষ্টতা (মাইক্রোসেকেন্ড) আছে এবং সময়ের সাথে সাথে পছন্দ করা হয়।


এখানে স্টিভেন এর উত্তরের জন্য একটি সহজ wrapper। এই ফাংশন পুনরাবৃত্তি রান / গড় না, শুধু সর্বত্র সময় কোড পুনরাবৃত্তি থেকে আপনি সংরক্ষণ করে না :)

'''function which prints the wall time it takes to execute the given command'''
def time_func(func, *args): #*args can take 0 or more 
  import time
  start_time = time.time()
  func(*args)
  end_time = time.time()
  print("it took this long to run: {}".format(end_time-start_time))

টাইমিংয়ের পাশাপাশি, আপনি যে কোডটি দেখান সেটি কেবল ভুল: আপনি 100 সংযোগগুলি চালান (পুরোপুরি সমস্তকে বাদ দেওয়ার পরে), এবং তারপরে যখন আপনি প্রথম এক্সিকিউট কলটি করেন তখন আপনি এটি একটি স্থানীয় পরিবর্তনশীল query_stmt পাস করেন যা আপনি কেবলমাত্র পরেই শুরু করেন কল চালানো।

প্রথমে, আপনার কোডটি সঠিক সময় নিয়ে চিন্তা করুন, এখনও সময় নিয়ে চিন্তা না করে: অর্থাত্ এমন একটি ফাংশন যা একটি সংযোগ তৈরি করে বা গ্রহণ করে এবং 100 বা 500 সঞ্চালন করে বা সংযোগটির যেকোনো সংখ্যক আপডেট করে তবে সংযোগ বন্ধ করে। একবার আপনার কোডটি সঠিকভাবে কাজ করার পরে সঠিক সময়টি timeit ব্যবহার করার কথা ভাবুন!

বিশেষত, যদি আপনি সময়টি চান এমন ফাংশন-কম একটি timeit.timeit বলা হয় তবে আপনি timeit.timeit ব্যবহার করতে পারেন (2.6 বা তার পরে - এটি 2.5 এবং এর আগে আরও জটিল):

timeit.timeit('foobar()', number=1000)

ডিফল্ট, এক মিলিয়নের বেশি আপনার ব্যবহারের ক্ষেত্রে উচ্চতর হতে পারে (আপনি এই কোডটিতে অনেক সময় ব্যয় করতে নেতৃত্ব দিচ্ছেন; -)।





database-tuning