Python ile Ortalama Hesaplama Fonksiyonu

Python’da ortalama hesaplama amaçlı olarak bir fonksiyon yazacağız. Kodları hem Python 2.x hem de Python 3.x sürümü için 2 şekilde yayınlıyorum. Ortalama hesaplamak için liste veya demetlerden faydalanacağız. Zaten birazdan fonksiyonu yazdığımızda ne demek istediğimizi daha rahat anlayacağız. Daha sonra kodumuzu biraz daha geliştirip performans testini yapacağız. Son olarak da rastgele sayılar seçip normal dağılıma uyup uymadığına bakacağız.

Bir arkadaşım C’de pointerlarla yaptıklarını Python’da nasıl halledebildiğimizi sordu. Pointer’ın yerini tutan kod bu mu olur tam emin olmamakla birlikte, ortalama hesaplamak için bir fonksiyon yazmak istedim. Şimdi bu fonksiyonu 2 Python sürümü için ayrı ayrı inceleyeceğiz.

Öncelikle, yapmamız gereken şey, fonksiyona istediğimiz kadar sayı gönderebilmek ve bu gelen sayılarla basit bir ortalama hesabı yapmak(sayıların toplamı/gelen sayı miktarı). Lafı fazla uzatmadan kodumuzu görelim ve onun üzerinden devam edelim.

Python3 kodu:

def ortalama(gelen_sayilar):
    miktar = len(gelen_sayilar)
    toplam = 0
    for i in gelen_sayilar:
        toplam += i
    return toplam/miktar

# Şimdi fonksiyonu deneyelim:
sayilar = [1,2,543,654,564326,654,241,543]
print(ortalama(sayilar))

Python 2.x kullanıyorsanız:

# -*- coding: cp1254 -*-
from __future__ import division
def ortalama(gelen_sayilar):
    miktar = len(gelen_sayilar)
    toplam = 0
    for i in gelen_sayilar:
        toplam += i
    return toplam/miktar

# Şimdi fonksiyonu deneyelim:
sayilar = [1,2,543,654,564326,654,241,543]
print ortalama(sayilar)

Şimdi kodlarımızı açıklayalım. Öncelikle Pyhon 2.x sürümündeki ilk 2 satırda yer alan kodların Python3’te olmadığına dikkat edin. İlk satırda sayfanın kod diziminden, ikinci satırda ise ortalama hesaplarken yapacağımız bölme işleminin tamsayıya yuvarlanmaması için bu kodu yazdık. Daha sonrası print komutuna kadar ikisinde de aynı. Şimdi o kısımları açıklayalım.

Önce ortalama isimli bir fonksiyon tanımladık. Ardından, fonksiyona gelecek sayıları gelen_sayilar isimli değişkene aldık. Burada istediğimiz kadar bilgili bir liste veya demet ile fonksiyonumuza gönderebiliyoruz. Yine, return ifadesini de aynı şekilde kullanabiliyoruz. Daha sonra, kaç tane sayı geldiğini öğrenmek için len fonksiyonuyla gelen liste veya demetin kaç öğe içerdiğini öğrendik. Hemen ardında, toplam değerine 0 başlangıç değerini atadık. Bunun da ardından, gelen sayıları bir for döngüsüne sokup hepsini toplam isimli değişkende topladık. En son da, sayıların toplamını kaç tane olduklarına bölüp fonksiyon çıktısı olarakreturn ifadesi ile döndürdük.

Altta da, 1,2,543,654,564326,654,241,543 sayılarının ortalamasını öğrenmek için bu sayıları bir değişkene atayıp bu değişkeniortalama adını verdiğimiz fonksiyona yolladık. En son olarak da Python sürümüne göre uygun olan print ifadesini kullanarak ekrana yazdırdık.

Şimdi performans için neler yapabiliriz ona bir bakalım. Bu kısımdan sonrasına Python3 altında devam edeceğim.Python2 ye çevirmek isterseniz birkaç satırda ufak değişiklikler dışında bir şey yapmanız gerekmiyor. Yine de sorun yaşarsanız buradan yazabilirsiniz, elimden geldiğince yardımcı olmaya çalışırım. 1 ile 1000000 arasında rastgele seçilmiş 10000 sayı alalım ve bunların ortalamasını hesaplayalım. Bunu farklı şekillerde yapıp çalışma sürelerini karşılaştıralım ve hangisinin en performanslı olduğuna karar verelim. Önce biraz daha uzun halde yazdığımız koda bakalım.

import time, random
baslangic = time.time()

sayilar = []
for i in range(10000):
    yenisayi = random.randint(1,1000000)
    sayilar.append(yenisayi)
toplam = 0
for i in range(10000):
    toplam +=i

miktar = len(sayilar)
print(toplam/miktar)

bitis = time.time()
print("çalışma süresi = {}".format(bitis-baslangic))
# çalışma süresi = 0.032000064849853516

Burada uzun uzun 10000 kere 1-1000000 arasından sayı alıp toplamını bulup daha sonra da bu sayıların miktarını hesaplayıp birbirine böldük. Şimdi kodumuzun biraz daha iyileştirilmiş haline bir bakalım:

import time, random

baslangic = time.time()
toplam = sum([random.randint(1,1000000) for i in range(10000)])
print(toplam/10000)
bitis = time.time()

print("çalışma süresi = {}".format(bitis-baslangic))
# çalışma süresi = 0.04699993133544922

Burada önce list comprehension ile sayılarımızı atadık, daha sonra sum fonksiyonuyla toplamlarını alıp tek satırda değişkene atadık. Kaç sayı olduğunu bildiğimiz için de direk 10000’e böldük. Daha sonra da sonucu ekrana yazdırdık. Süreler bilgisayarınızın hızına göre değişebilir. Onun için kendi sonuçlarımı yorum satırı içerisinde verdim.

Şimdi de normal dağılım kontrolüne bakalım. Beklenen ortalama değeri 500000 olmalı. Yapılan deney sayısı arttıkça(burada 10000) elde ettiğimiz ortalama 500000’e daha çok yaklaşmalı. Şimdi iki kodumuzu da buna göre düzenleyelim. Çalışma süreleri arasındaki fark da şimdi daha belli bir hal almaya başlayacak. Hemen görelim:

import time, random
baslangic = time.time()

sayilar = []
for i in range(1000000):
    yenisayi = random.randint(1,1000000)
    sayilar.append(yenisayi)
toplam = 0
for i in range(1000000):
    toplam +=i

miktar = len(sayilar)
print(toplam/miktar)

bitis = time.time()
print("çalışma süresi = {}".format(bitis-baslangic))

Bu kodun çalışma süresi : 4.4070000648498535 saniye ve çıktısı 499999.5 oldu. Oldukça yakın bir rakam. Diğer koda da bakalım.

import time, random

baslangic = time.time()
toplam = sum([random.randint(1,1000000) for i in range(1000000)])
print(toplam/1000000)
bitis = time.time()

print("çalışma süresi = {}".format(bitis-baslangic))

Bu kodun çalışma süresi : 3.875 saniye ve verdiği çıktı 500485.350229 oldu. Süredeki azalmayı görebiliriz. Çıktının diğerine göre daha uzak olması ise bilgisayarın rastgele seçtiği rakamlarla alakalı bir durum. Tersi de mümkün olabilirdi.

 
comments powered by Disqus