ionelmc / pytest-benchmark

py.test fixture for benchmarking code
BSD 2-Clause "Simplified" License
1.22k stars 115 forks source link

Getting TypeError: 'NoneType' object is not Callable #258

Open bab014 opened 3 months ago

bab014 commented 3 months ago

First time user. Followed the instructions, I see that benchmark is an active plugin but everytime I try and use the benchmark fixture I get that error.

What am I doing wrong?

import csv

pytest_plugins = ("benchmark",)

def csv_ingest():
    with open("./data/customers-2000000.csv") as f:
        csv_reader = csv.reader(f)
        count: int = 0
        for record in csv_reader:
            # if count == 1:
            # print(record)
            new_record = record[0:4]
            name = new_record[2].upper()

def raw_ingest():
    with open("./data/customers-2000000.csv") as f:
        count: int = 0
        for line in f:
            record = line.split(",")
            # if count == 1:
            # print(record)
            new_record = record[0:4]
            name = new_record[2].upper()

def test_csv_ingest(benchmark):
    """
    Testing speed of initial ingest
    """
    benchmark(csv_ingest())

def test_raw_ingest(benchmark):
    """
    Testing speed of initial ingest
    """
    benchmark(raw_ingest())

And the full error

pytest
============================================================= test session starts ==============================================================
platform linux -- Python 3.11.2, pytest-8.1.1, pluggy-1.4.0
benchmark: 4.0.0 (defaults: timer=time.perf_counter disable_gc=False min_rounds=5 min_time=0.000005 max_time=1.0 calibration_precision=10 warmup=False warmup_iterations=100000)
rootdir: /home/bret/repos/python/beamery
plugins: benchmark-4.0.0
collected 2 items                                                                                                                              

test_main.py FF                                                                                                                          [100%]

=================================================================== FAILURES ===================================================================
_______________________________________________________________ test_csv_ingest ________________________________________________________________

benchmark = <pytest_benchmark.fixture.BenchmarkFixture object at 0x7f3e66098e90>

    def test_csv_ingest(benchmark):
        """
        Testing speed of initial ingest
        """
>       benchmark(csv_ingest())

test_main.py:35: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.11/site-packages/pytest_benchmark/fixture.py:125: in __call__
    return self._raw(function_to_benchmark, *args, **kwargs)
.venv/lib/python3.11/site-packages/pytest_benchmark/fixture.py:147: in _raw
    duration, iterations, loops_range = self._calibrate_timer(runner)
.venv/lib/python3.11/site-packages/pytest_benchmark/fixture.py:275: in _calibrate_timer
    duration = runner(loops_range)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

loops_range = range(0, 1), timer = <built-in function perf_counter>

    def runner(loops_range, timer=self._timer):
        gc_enabled = gc.isenabled()
        if self._disable_gc:
            gc.disable()
        tracer = sys.gettrace()
        sys.settrace(None)
        try:
            if loops_range:
                start = timer()
                for _ in loops_range:
>                   function_to_benchmark(*args, **kwargs)
E                   TypeError: 'NoneType' object is not callable

.venv/lib/python3.11/site-packages/pytest_benchmark/fixture.py:90: TypeError
_______________________________________________________________ test_raw_ingest ________________________________________________________________

benchmark = <pytest_benchmark.fixture.BenchmarkFixture object at 0x7f3e65fac5d0>

    def test_raw_ingest(benchmark):
        """
        Testing speed of initial ingest
        """
>       benchmark(raw_ingest())

test_main.py:42: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.11/site-packages/pytest_benchmark/fixture.py:125: in __call__
    return self._raw(function_to_benchmark, *args, **kwargs)
.venv/lib/python3.11/site-packages/pytest_benchmark/fixture.py:147: in _raw
    duration, iterations, loops_range = self._calibrate_timer(runner)
.venv/lib/python3.11/site-packages/pytest_benchmark/fixture.py:275: in _calibrate_timer
    duration = runner(loops_range)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

loops_range = range(0, 1), timer = <built-in function perf_counter>

    def runner(loops_range, timer=self._timer):
        gc_enabled = gc.isenabled()
        if self._disable_gc:
            gc.disable()
        tracer = sys.gettrace()
        sys.settrace(None)
        try:
            if loops_range:
                start = timer()
                for _ in loops_range:
>                   function_to_benchmark(*args, **kwargs)
E                   TypeError: 'NoneType' object is not callable

.venv/lib/python3.11/site-packages/pytest_benchmark/fixture.py:90: TypeError
=========================================================== short test summary info ============================================================
FAILED test_main.py::test_csv_ingest - TypeError: 'NoneType' object is not callable
FAILED test_main.py::test_raw_ingest - TypeError: 'NoneType' object is not callable
============================================================== 2 failed in 5.78s ===============================================================
ionelmc commented 3 months ago

You're passing the result (None) of of your function instead of passing the function. Remove those (). Eg: benchmark(csv_ingest)

On Fri, Apr 19, 2024, 21:57 Bret Beatty @.***> wrote:

First time user. Followed the instructions, I see that benchmark is an active plugin but everytime I try and use the benchmark fixture I get that error.

What am I doing wrong?

import csv pytest_plugins = ("benchmark",)

def csv_ingest(): with open("./data/customers-2000000.csv") as f: csv_reader = csv.reader(f) count: int = 0 for record in csv_reader:

if count == 1:

        # print(record)
        new_record = record[0:4]
        name = new_record[2].upper()

def raw_ingest(): with open("./data/customers-2000000.csv") as f: count: int = 0 for line in f: record = line.split(",")

if count == 1:

        # print(record)
        new_record = record[0:4]
        name = new_record[2].upper()

def test_csv_ingest(benchmark): """ Testing speed of initial ingest """ benchmark(csv_ingest())

def test_raw_ingest(benchmark): """ Testing speed of initial ingest """ benchmark(raw_ingest())

— Reply to this email directly, view it on GitHub https://github.com/ionelmc/pytest-benchmark/issues/258, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAA7TXKR2FHFWAGA3KTPTDDY6FSJ3AVCNFSM6AAAAABGPVQ4JCVHI2DSMVQWIX3LMV43ASLTON2WKOZSGI2TGNZQGUYDSMQ . You are receiving this because you are subscribed to this thread. Message ID: @.***>

bab014 commented 3 months ago

Wow, so simple, can't believe I missed it. Thank you.