diff --git a/pyhmmer/plan7.pxd b/pyhmmer/plan7.pxd
index 2b2e59777df0e8967823860bb054f20904015854..f02006669455483aa8d72e717b6627bb4b2d6077 100644
--- a/pyhmmer/plan7.pxd
+++ b/pyhmmer/plan7.pxd
@@ -173,6 +173,7 @@ cdef class HMMPressedFile:
     cdef P7_HMMFILE* _hfp
     cdef Alphabet    _alphabet
     cdef HMMFile     _hmmfile
+    cdef size_t      _position
 
     cpdef void close(self) except *
     cpdef void rewind(self) except *
diff --git a/pyhmmer/plan7.pyi b/pyhmmer/plan7.pyi
index 4393079dbd40f96ce2811807adcc55d70ff20af1..e6c67a08adc89038870777c89ffcf9f91a12baf2 100644
--- a/pyhmmer/plan7.pyi
+++ b/pyhmmer/plan7.pyi
@@ -453,6 +453,7 @@ class HMMPressedFile(typing.Iterator[OptimizedProfile]):
     ) -> bool: ...
     def __iter__(self) -> HMMPressedFile: ...
     def __next__(self) -> OptimizedProfile: ...
+    def __len__(self) -> int: ...
     @property
     def closed(self) -> bool: ...
     @property
diff --git a/pyhmmer/plan7.pyx b/pyhmmer/plan7.pyx
index 2f7e1fc13ec73bdb4036292f3a67ca64e56a84a0..9137461c160317d805905d0bf0970d219fbb37f2 100644
--- a/pyhmmer/plan7.pyx
+++ b/pyhmmer/plan7.pyx
@@ -3750,6 +3750,7 @@ cdef class HMMPressedFile:
         self._alphabet = None
         self._hmmfile = None
         self._hfp = NULL
+        self._position = 0
 
     def __init__(self, object file):
         """__init__(self, file)\n--\n
@@ -3790,6 +3791,10 @@ cdef class HMMPressedFile:
     def __exit__(self, exc_type, exc_value, traceback):
         self.close()
 
+    def __len__(self):
+        assert self._hfp.ssi != NULL
+        return self._hfp.ssi.nprimary - self._position
+
     # --- Properties ---------------------------------------------------------
 
     @property
@@ -3822,6 +3827,7 @@ cdef class HMMPressedFile:
         """Rewind the file back to the beginning.
         """
         self._hmmfile.rewind()
+        self._position = 0
 
     cpdef OptimizedProfile read(self):
         """Read the next optimized profile from the file.
@@ -3856,6 +3862,7 @@ cdef class HMMPressedFile:
 
         if status == libeasel.eslOK:
             om.alphabet = self._alphabet
+            self._position += 1
             return om
         elif status == libeasel.eslEOF:
             return None
diff --git a/pyhmmer/tests/test_plan7/test_hmmfile.py b/pyhmmer/tests/test_plan7/test_hmmfile.py
index 900aa24750be3e1d98035b526c70e25b0010d758..a71fea8f5f56730142a3bff176587b32b3d05c7f 100644
--- a/pyhmmer/tests/test_plan7/test_hmmfile.py
+++ b/pyhmmer/tests/test_plan7/test_hmmfile.py
@@ -93,6 +93,16 @@ class _TestHMMPath:
         with self.open_hmm(path) as f:
             self.check_hmmfile(f.optimized_profiles())
 
+    def test_optimized_profiles_length(self):
+        path = os.path.join(self.hmms_folder, "db", "{}.hmm".format(self.ID))
+        with self.open_hmm(path) as f:
+            profiles = f.optimized_profiles()
+            self.assertEqual(len(profiles), len(self.NAMES))
+            profiles.read()
+            self.assertEqual(len(profiles), len(self.NAMES) - 1)
+            profiles.rewind()
+            self.assertEqual(len(profiles), len(self.NAMES))
+
     def test_rewind(self):
         path = os.path.join(self.hmms_folder, "txt", "{}.hmm".format(self.ID))
         with self.open_hmm(path) as f: